1.找出数组中重复数字
给定一个长度为 n的整数数组 nums,数组中所有的数字都在 0∼n−1的范围内。
数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。
请找出数组中任意一个重复的数字。
注意:如果某些数字不在 0∼n−1的范围内,或数组中不包含重复数字,则返回 -1;
数据范围:
0≤n≤1000
样例:
给定 nums = [2, 3, 5, 4, 3, 2, 6, 7]。
返回 2 或 3。
代码:
class Solution {
public int duplicateInArray(int[] nums) {
// n为nums数组长度
int n = nums.length;
// 第一遍检查,确保所有数字都在合法范围内[0,n-1]
// 如果有数字不在合法范围内,则直接返回-1
for(int i = 0;i < n;i++){
if(nums[i]<0||nums[i]>=n)return -1;
}
// 第二遍:利用原地交换的方法找到重复的数字
for(int i = 0;i<n;i++){
// 如果nums[i]!=nums[nums[i]]表示数组中下标为nums[i]上的元素位置不正确
// 此时交换nums[i]和nums[nums[i]],将nums[i]放在正确的位置nums[nums[i]]上
// 不断交换直到不能交换为止
while(nums[i]!=nums[nums[i]])swap(i,nums[i],nums);
// 如果当前位置i所对应的值不是i,说明找到了重复数字
if(nums[i]!=i)return nums[i];
}
// 如果没有找到重复数字,返回-1
return -1;
}
// 交换数组中两个位置的元素
public void swap(int x,int y,int[] nums){
int temp = nums[x];
nums[x] = nums[y];
nums[y] = temp;
}
}

浙公网安备 33010602011771号