/**
* 定义一个函数,输入为整数数组,输出为重复数字
*/
public int findRepeatNumber(int[] nums) {
int arr = 0; // 定义一个变量用来存储重复数字
for(int i = 0; i < nums.length - 1; i++) { // 第一层循环,遍历整个数组
for (int j = i + 1; j < nums.length; j++) { // 第二层循环,从当前位置的下一位开始遍历数组
if (nums[i] == nums[j]) { // 如果发现重复数字
arr = nums[i]; // 将重复数字存储到变量中
break; // 跳出循环
}
}
if (arr != 0) break; // 如果已经找到重复数字,跳出循环
}
return arr; // 返回重复数字
}
/**
* 遍历数组,如果当前元素不等于它所在的下标,交换 nums[i] 和 nums[nums[i]] 位置上的元素,
* 使得 nums[i] 处的元素等于它所在的下标,直到找到重复数字。
*/
public int findRepeatNumber(int[] nums) {
for (int i = 0; i < nums.length; i++) { // 遍历数组
while (nums[i] != i) { // 如果当前元素不等于它所在的下标
if (nums[i] == nums[nums[i]]) { // 如果当前元素所在的位置已经有相同的元素了,说明找到了重复数字
return nums[i]; // 直接返回该重复数字
}
int temp = nums[i]; // 交换 nums[i] 和 nums[nums[i]] 位置上的元素,使得 nums[i] 处的元素等于它所在的下标
nums[i] = nums[temp];
nums[temp] = temp;
}
}
return -1; // 如果数组中没有重复数字,则返回 -1
}
/**
* 利用限制条件,将空间复杂度降到 O(1)。由于数组中的元素值都在 [0, n-1] 的范围内,
* 因此可以利用这个限制条件,将数组看成一个哈希表,在遍历数组时,将每个元素放到它所对应的位置上,
* 如果发现该位置上已经有相同的元素了,说明找到了重复数字。
*/
public int findRepeatNumber(int[] nums) {
for (int i = 0; i < nums.length; i++) { // 遍历数组
while (nums[i] != i) { // 如果当前元素不等于它所在的下标
if (nums[i] == nums[nums[i]]) { // 如果当前元素所在的位置已经有相同的元素了,说明找到了重复数字
return nums[i]; // 直接返回该重复数字
}
int temp = nums[i]; // 交换 nums[i] 和 nums[nums[i]] 位置上的元素
nums[i] = nums[temp];
nums[temp] = temp;
}
}
return -1; // 如果数组中没有重复数字,则返回 -1
}