数组中重复出现的数字
方案一、
在一个长度为n的数组里的所有数字都是1-(n-1)的范围内,数组中的某些数字是重复的,但不知道有哪几个数字重复,也不知道重复几次,请找出任意一个重复的数字,例如:输入长度为7的数组
arr[7] = {2,3,1,0,2,5,3};
那么输出对应的数字是2或3
利用哈希表:
分析步骤:
2 3 1 0 2 5 3 | arr[0] != 0
1 3 2 0 2 5 3 | 交换
3 1 2 0 2 5 3
0 1 2 3 2 5 3 |此时
arr[i] = i;i<4
arr[4] != 4; arr[4] == 2 == arr[2];
return 2;
arr[5] == 5;
arr[6] != 6; arr[6] == arr[3]
return 3;
写出如下代码:
bool FindRepeat(int arr[], int length, int *dest) { if(arr == nullptr || length <= 0) { return false; } int i = 0; for(i=0;i<=length-1;++i) { if(arr[i]<0 || arr[i] > length-1) { return false; } } for(i=0;i<=length-1;++i) { while(arr[i] != i) { if(arr[i] == arr[arr[i]]) { *dest = arr[i]; return true; } int temp = arr[i]; arr[i] = arr[temp]; arr[temp] = temp; } } return false; }
方案二、
先对数组进行排序,接下来在排好序的数组找重复出现的并返回:
未优化后的代码:仅仅考虑输入数组有效的情况
#include<stdio.h> void findrepeat(int arr[], int size) { int i = 0; for(i=0;i<size;i++) { int j = 0; for(j=0;j<size-i-1;j++) { if(arr[j]>arr[j+1]) { int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } for(i=0;i<size;i++) { if(arr[i] == arr[i+1]) { printf("%d\n",arr[i]); break; } } } int main() { int arr[] = {2,3,1,0,2,5,3}; int size = sizeof(arr)/sizeof(arr[0]); findrepeat(arr, size); return 0; }先对数组进行排序,接下来在排好序的数组找重复出现的并返回:优化后的代码:
数组中重复出现的数字
#include<stdio.h> int findrepeat(int arr[], int size) { int i = 0; int tmp = 0; if(arr == NULL || size<=0) //判定传入数组是否为空 { return 0; } for(i=0;i<size;i++) //判定传入数组是否满足题意 { if(arr[i]<0 || arr[i]>size-1) { return 0; } } for(i=0;i<size;i++) //冒泡排序 { int j = 0; for(j=0;j<size-i-1;j++) { if(arr[j]>arr[j+1]) { int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } for(i=0;i<size;i++) //找重复出现的数字并返回打印 { if(arr[i] == arr[i+1]) { tmp = arr[i]; break; } }return tmp; } int main() { int arr[] = {2,3,1,0,2,5,3}; int size = sizeof(arr)/sizeof(arr[0]); printf("%d\n",findrepeat(arr, size)); }