【LeetCode】挑战100天 Day16(热题+面试经典150题)
【LeetCode】挑战100天 Day16(热题+面试经典150题)
- 一、LeetCode介绍
- 二、LeetCode 热题 HOT 100-18
- 2.1 题目
- 2.2 题解
- 三、面试经典 150 题-18
- 3.1 题目
- 3.2 题解
一、LeetCode介绍
LeetCode是一个在线编程网站,提供各种算法和数据结构的题目,面向程序员、计算机科学专业学生和技术爱好者等人群,旨在帮助他们提高算法和编程技能。LeetCode上的问题通常来自各种技术公司的面试题目,因此它也是程序员面试准备的重要资源之一。
LeetCode上的问题涵盖了各种难度级别,从入门级到专家级都有不同难度的题目可供练习。用户可以选择使用不同的编程语言提交答案,LeetCode能够对结果进行评估并返回测试结果。
除了题目外,LeetCode还提供了讨论区、排行榜等社区功能,用户可以在这里交流学习心得、解决疑难问题,并与其他用户比较自己的做题成绩。
挑战100天 AI In LeetCode是基于LeetCode题库,借助AI的能力进行解题、并学习其解题过程。
二、LeetCode 热题 HOT 100-18
2.1 题目
四数之和
给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):
0 <= a, b, c, d < n
a、b、c 和 d 互不相同
nums[a] + nums[b] + nums[c] + nums[d] == target
你可以按 任意顺序 返回答案 。
示例 1:
输入:nums = [1,0,-1,0,-2,2], target = 0
输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]
示例 2:
输入:nums = [2,2,2,2,2], target = 8
输出:[[2,2,2,2]]
提示:
1 <= nums.length <= 20^0
-109 <= nums[i] <= 10^9
-109 <= target <= 10^9
2.2 题解
解题思路:
当处理大整数时,为了避免溢出问题,我们需要在计算四数之和的过程中使用长整型来存储计算结果。具体地,在双指针移动的过程中,将四个数的和存储为长整型,即(long)nums[i] + nums[j] + nums[left] + nums[right]。
另外,本题的解题思路基于三数之和的解法进行延伸,利用双指针法来解决四数之和的问题。首先将数组从小到大排序,然后枚举前两个数nums[i]和nums[j],在剩下的元素中使用双指针找到符合条件的另外两个数。
在双指针移动的过程中,需要注意去重。为了避免重复,当nums[i]、nums[j]、nums[left]和nums[right]组成的四元组符合条件时,我们应该分别将left和right移动到下一个不同的位置,而不是直接跳过这个四元组。
class Solution {
public List<List<Integer>> fourSum(int[] nums, int target) {
List<List<Integer>> ans = new ArrayList<>();
if (nums == null || nums.length < 4) return ans;
Arrays.sort(nums);
int n = nums.length;
for (int i = 0; i < n - 3; i++) {
if (i > 0 && nums[i] == nums[i-1]) continue;
for (int j = i + 1; j < n - 2; j++) {
if (j > i + 1 && nums[j] == nums[j-1]) continue;
int left = j + 1, right = n - 1;
while (left < right) {
long sum = (long)nums[i] + nums[j] + nums[left] + nums[right];
if (sum == target) {
ans.add(Arrays.asList(nums[i], nums[j], nums[left], nums[right]));
left++;
right--;
while (left < right && nums[left] == nums[left - 1]) left++;
while (left < right && nums[right] == nums[right + 1]) right--;
} else if (sum < target) {
left++;
} else {
right--;
}
}
}
}
return ans;
}
}
三、面试经典 150 题-18
数组 / 字符串
3.1 题目
最后一个单词的长度
给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。
单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。
示例 1:
输入:s = "Hello World"
输出:5
解释:最后一个单词是“World”,长度为5。
示例 2:
输入:s = " fly me to the moon "
输出:4
解释:最后一个单词是“moon”,长度为4。
示例 3:
输入:s = "luffy is still joyboy"
输出:6
解释:最后一个单词是长度为6的“joyboy”。
提示:
1 <= s.length <= 104
s 仅有英文字母和空格 ' ' 组成
s 中至少存在一个单词
3.2 题解
解题思路:
- 首先,我们需要去除字符串末尾可能存在的空格字符,以防止最后一个单词被漏掉。
- 然后,从字符串末尾开始向前遍历,找到最后一个非空格字符的位置,即最后一个单词的结尾位置。记为end。
- 再次从end位置向前遍历,找到最后一个空格字符的位置,即最后一个单词的起始位置。记为start。
- 最后一个单词的长度即为end - start。
class Solution {
public int lengthOfLastWord(String s) {
// 去除字符串末尾的空格字符
String trimmedStr = s.trim();
int end = trimmedStr.length() - 1;
int start = end;
while (start >= 0 && trimmedStr.charAt(start) != ' ') {
start--;
}
return end - start;
}
}
至此,挑战100天 AI In LeetCode Day16(热题+面试经典150题)完成,后续会持续调整;查阅过程中若遇到问题欢迎留言或私信交流。