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]; //让他与此元素代表的下标所对应的位置交换元素 int tmp = nums[i]; nums[i] = nums[tmp]; nums[tmp] = tmp; } } return 0; } }
数组中的数字都在0~n-1范围内。如果这个数组没有重复元素,那么在对这个数组排完序后,数字 i 将出现在下标 i 处。有些位置可能存在多个数字,同时有些位置可能没有数字。
遍历数组,当扫描到下标为 i 的数字时,首先比较这个数字(用m表示)是不是等于i。
如果是,则接着扫描下一个数字;如果不是,则再拿他和第m个数字进行比较。如果他和第m个数字相等,就找到了一个重复的数字;如果他和第m个数字不相等,就把第i个数字和第m个数字交换
接下来重复这个比较和交换的过程,直到我们发现一个重复的数字。