用HashMap的解法就不多说了
另一种解法 原地交换 空间复杂度为1
public int findRepeatNumber(int[] nums) {
/** 如果该数组没有重复的数时,每一个索引都对应着唯一的那个数
* 但是现在一个数对应多个索引
* 通过交换,使索引和数值一一对应,做到类似于字典的作用*/
int i = 0;
while (i < nums.length){
/** 如果当前索引已经和数值对应上了,就往当前后移一位*/
if (nums[i] == i){//当前位置的数值等于当前位置的索引
i++;
continue;
}
/** 如果当前位置的数值 在该数值位置的索引上已经存在了*/
if (nums[i] == nums[nums[i]]){//当前位置的数值 等于在该数值位置上的数值
return nums[i];//直接返回该数值
}
/** 将当前数值放到相对应的索引位置上去*/
int temp = nums[i];
nums[i] = nums[temp];
nums[temp] = temp;
}
return -1;
}