3. 数组中重复的数字
题目描述
在一个长度为 n 的数组里的所有数字都在 0 到 n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。例如,如果输入长度为 7 的数组 {2, 3, 1, 0, 2, 5, 3},那么对应的输出是第一个重复的数字 2。
https://blog.csdn.net/jsqfengbao/article/details/47438557
https://www.cnblogs.com/AndyJee/p/4693099.html
结题思路:
以数组{2,3,1,0,2,5,3}为例来分析找到重复数字的步骤。数组的第0个数字(从0开始计数,和数组的下标保持一致)是2,与它的下标不想等,于是把它和下标为2的数字1交换,交换后的数组是{1,3,2,0,2,5,3}。此时第0 个数字是1,仍然与它的下标不想等,继续把它和下标为1的数字3交换,得到数组{0,1,2,3,2,5,3}。此时第0 个数字为0,接着扫描下一个数字,在接下来的几个数字中,下标为1,2,3的三个数字分别为1,2,3,他们的下标和数值都分别相等,因此不需要做任何操作。接下来扫描下标为4的数字2.由于它的值与它的下标不登,再比较它和下标为2的数字。注意到此时数组中下标为2的数字也是2,也就是数字2和下标为2和下标4的两个位置了,因此找到一个重复的数字。
public boolean duplicate(int[] nums, int length, int[] duplication) {
if (nums == null || length <= 0) return false;
for (int i = 0; i < length; i++) {
while (nums[i] != i && nums[i] != nums[nums[i]]) {
swap(nums, i, nums[i]);
}
if (nums[i] != i && nums[i] == nums[nums[i]]) {
duplication[0] = nums[i];
return true;
}
}
return false;
}
private void swap(int[] nums, int i, int j) {
int t = nums[i]; nums[i] = nums[j]; nums[j] = t;
}
网友评论