此题使用java set即可快速解决问题,在此省略那种算法。着重记录下使用数组排序(非常规排序)方式:
以 [2, 3, 1, 0, 5, 4, 3,5]为例:
i=0 num[i]=2 num[num[i]]= 1
交换:2 和1 (将2赶走放到他该在的位置)
13205435
i=0 num[i]=1 num[num[i]]= 3
交换:1 和3 (1也不该在这里,将1赶走放到他该在的位置)
31205435
i=0 num[i]=3 num[num[i]]= 0
交换:3 和0 (3也不该在这里,将3赶走放到他该在的位置)
01235435
此处省略了正确的步骤,1,2,3的位置都正确:
i=1 num[i]=1 num[num[i]]= 1
i=2 num[i]=2 num[num[i]]= 2
i=3 num[i]=3 num[num[i]]= 3
i=4 num[i]=5 num[num[i]]= 4
i=4 num[i]=5 num[num[i]]= 4
交换:5 和4
01234535
5位置正确继续
i=5 num[i]=5 num[num[i]]= 5
i=6 num[i]=3 num[num[i]]= 3 此时发现i=6位置上的数是应该出现在以前的位置上,说明重复了!返回即可
class Solution {
public int findRepeatNumber(int[] nums) {
int temp;
for(int i=0;i<nums.length;i++){
while (nums[i]!=nums[nums[i]]){
temp=nums[i];
nums[i]=nums[temp];
nums[temp]=temp;
}
if(nums[i]!=i){
return nums[i];
}
}
return -1;
}
}