[面试题03]数组中的重复数字
排序
排序后找重复数字比较容易,可以使用双指针,或者两两比较
class Solution {
public int findRepeatNumber(int[] nums) {
Arrays.sort(nums);
int i = 0;
for(int j = i+1; j < nums.length; j++){
if(nums[i] == nums[j]) return nums[i];
i = j;
}
return -1;
}
}
哈希表
检测哈希表有无重复放入数字
class Solution {
public int findRepeatNumber(int[] nums) {
HashSet set = new HashSet();
for(int i = 0; i < nums.length; i++) {
if(!set.contains(nums[i]))set.add(nums[i]);
else return nums[i];
}
return -1;
}
}
放入指定位置
因为数组长度为n,而元素范围为0-n-1;所以该数字若无重复数字则数组下标和其元素应该相等,从头遍历数组如果数组元素和其下标不一致则将其放到与它下标相同的位置,放入前判断该位置是否有相同元素,若无则交换,若有则返回该元素。
class Solution {
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];
exch(nums, i, nums[i]);
}
}
return -1;
}
private void exch(int[] nums, int i, int j){
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}