剑指Offer 03-数组中重复的数字
一、题目描述
找出数组中重复的数字。
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
示例:
输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3
二、问题分析
1.遍历数组
由于只需要找出数组中任意一个重复的数字,因此遍历此数组一定能找到重复的数字,然后将此数字返回即可。
2.原地置换
一个萝卜一个坑的思想:由于长度为n且数字都在0~n-1的范围之内,那么元素与数组下标是可以一一对应的。故可以让他们一一对应,若“正确”的位置已经存在了“正确”,则该元素为重复元素,返回即可。
三、问题解决
遍历数组
public class RepeatNumber01 {
public static void main(String[] args) {
int[] nums = {1,2,5,6,7,8,9,4,20,24,15,24,69,68,69,200};
findRepeatNumber(nums);
}
public static int findRepeatNumber(int[] nums){
Set<Integer> set = new HashSet<Integer>();
int repeat = -1;
for(int num : nums){
if(!set.add(num)) {
repeat = num;
break;
}
}
System.out.println(repeat);
return repeat;
}
}
原地置换
public class RepeatNumber02 {
public static void main(String[] args) {
int[] nums = {1,2,2,4,5,6,78,98};
System.out.println(findRepeatNumber(nums));
}
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;
}
}