为什么80%的码农都做不了架构师?>>>
题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
思路:因为数字在0到n-1的范围,如果没重复的话,下标应该和所指的值相等。所以我们可以从第一个数开始找它相对应的下标。例:{2,3,1,0,2,5,3},从2开始,2应该移到下标为2的位置,也就是和1交换,然后1和3交换,3和0交换。。以此类推,直到发现所在下标的值和即将交换的值一样。
#include<iostream>
using namespace std;bool duplicate(int numbers[], int length, int* duplication)
{if (numbers == NULL || length <= 0){return false;}for (int i = 0; i < length; i++){if (numbers[i] < 0 || numbers[i] > length - 1){return false;}}for (int i = 0; i < length; i++){while (numbers[i] != i){if (numbers[i] == numbers[numbers[i]]) //即将交换的数和已存在的数相等,也就是重复了{*duplication = numbers[i];return true;}//不相等则继续交换int temp = numbers[i];numbers[i] = numbers[temp];numbers[temp] = temp;}}return false;
}int main()
{int a[7] = {6,3,1,0,2,5,3};int dup;bool result = duplicate(a, 7, &dup);if (result = true){cout << dup << endl;}return 0;
}