【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题)完成,后续会持续调整;查阅过程中若遇到问题欢迎留言或私信交流。