1. 数组中重复的数字
找出数组中重复的数字。
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
示例 1:输入:[2, 3, 1, 0, 2, 5, 3]输出:2 或 3限制:2 <= n <= 100000
思路:
(1) Set集合的contains方法判断
- Set集合自带API——contains(obj)
遍历整个数组:
- 当Set中不含有该元素,就将该元素加入Set
- 若有,则返回该元素(最终结果)。
class Solution { public int findRepeatNumber(int[] nums) { Set<Integer> set = new HashSet<>(); for(int num : nums){ if(set.contains(num)){ return num; } set.add(num); } return -1; } }
思路简单,代码简洁,运行速度一般。
(2)利用数组中元素都小于数组长度
- 由于数组中所有元素都小于数组长度,这样第一印象就让人想到了与数组的索引相关联。
- 考虑:
- 将数组中的元素进行调换,将元素交换到这个元素大小对应的索引位置。
- 每次调换之前,进行判断是否对应元素大小的索引位置是否含有与索引值相等的元素
- 如果有,那么说明当前元素就是重复元素
- 如果没有,则不是。
class Solution { public int findRepeatNumber(int[] nums) { for(int i=0;i<nums.length;i++){ if(nums[i]!=i){ if(nums[nums[i]] == nums[i]){ return nums[i]; } int tmp = nums[i]; nums[i] = nums[tmp]; nums[tmp] = tmp; } } return -1; } }2. 移除元素
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
示例 1:
输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]
解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。
示例 2:
输入:nums = [0,1,2,2,3,0,4,2], val = 2
输出:5, nums = [0,1,4,0,3]
解释:函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。
思路:
- 使用双指针
- 左指针指向元素要被覆盖的位置,并作为返回的结果
- 右指针用于扫描值不为val的元素
- 如果右指针扫描到了对应的值,赋值给左指针索引处,然后左指针自增
- 循环结束的条件是右指针扫描完整个数组
class Solution { public int removeElement(int[] nums, int val) { int left = 0; for(int right=0;right<nums.length;right++){ if(nums[right]!=val){ nums[left++] = nums[right]; } } return left; } }
