题目一:找出数组中重复的数字
在一个长度为n的数组里的所有数字都在0~n-1范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数组重复了几次。请找出数组中任意一个重复的数字。
例如:
{2,3,1,0,2,5,3}
output: 2 or 3
思路:扫描到下标为i的数字是,判断是否与num[i]的值相等,相等则继续扫描,否则与num[num[i]] 交换位置,继续判断值是否和i的位置相等,若不等,继续上面的步骤:
{1,3,2,0,2,5,3}
{3,1,2,0,2,5,3}
{0,1,2,3,2,5,3}
此时判断到num[4] 时 与 num[num[4]] 的值相等,则为重复数字。
void swap(int *num1, int *num2) {
int tmp = *num1;
*num1 = *num2;
*num2 = tmp;
}
void duplicate(int nums[], int length) {
int i = 0;
for (i = 0; i < length; i++) {
if (nums[i] != i) {
while (nums[i] != nums[nums[i]]) {
swap(&nums[i], &nums[nums[i]]); // 不相等交换两数
}
if (nums[i] == nums[nums[i]] && nums[i] != i) { // 重复条件
printf("repeat num: [%d]\n", nums[i]);
}
}
}
}
int main() {
int nums[7] = { 2,3,1,0,2,5,3 };
int length = 7;
duplicate(nums, length);
//stop;
return 0;
}