题目:查找数组中的重复数字,要求空间复杂度为O(1)(基于Java实现)
题目: 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。要求空间复杂度为O(1)。
虽然上述的题目是一道leetcode的简单题–(剑指 Offer 03. 数组中重复的数字),但是在leetcode当中的题目并没有要求空间复杂度为O(1),因此,这道题稍微要比 leetcode 难一点,而且,在面试各种大厂的时候,如果遇到这种看似简单的题,它是一定会给加上额外的条件的,而且这里又是说到数组,那么想都不用想,就是面试官肯定让你原地进行查找或者排序啥的,这都是套路了。。。。。
代码实现:
import java.util.ArrayList;
import java.util.List;
/*
* 查找数组中的重复数字,要求是空间复杂度O(1)
* ① 查找数组的重复的数字,遇到一个重复数字就返回;
* ② 查找数组中的重复数字,将所有的重复数字打印出来。
* */
public class FindRepeatNumber {
public static void main(String[] args) {
int[] nums = new int[]{2,4,1,6,3,7,3,5,7,2};
int t = findRepeatNumber(nums);
System.out.println(t);
System.out.println("-------");
int[] nums1 = new int[]{4,5,2,3,4,5,3};
List<Integer> res = findRepeatNumber1(nums1);
for(int i = 0; i < res.size(); i++){
System.out.println(res.get(i));
}
}
//在数组中如果遇到了一个重复数字就直接返回。
public static int findRepeatNumber(int[] nums) {
int temp;
for (int i = 0; i < nums.length; i++) {
while (nums[i] != i) {
if (nums[i] == nums[nums[i]]) {
return nums[i];
}
temp = nums[i];
nums[i] = nums[temp];
nums[temp] = temp;
}
}
return -1;
}
//将数组中全部的重复数字全部输出
//虽然我这里借助一个集合,但是我在查找重复数字的时候始终是原地查找的,即空间复杂度为O(1)
public static List<Integer> findRepeatNumber1(int[] nums) {
int temp;
List<Integer> res = new ArrayList<>();
int[] arr;
int j = 0;
for (int i = 0; i < nums.length; i++) {
while (nums[i] != i) {
if (nums[i] == nums[nums[i]]) {
res.add(nums[i]);
break;
}
temp = nums[i];
nums[i] = nums[temp];
nums[temp] = temp;
}
}
return res;
}
}
输出的结果:
3
-------
4
5
3