/*
* 题目:有100万个数字(1到9),其中只有1个数字重复2次,如何快速找出该数字?
*/
int main(int argc, char *argv[])
{
#if 0
int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9,
1, 3, 4, 6, 7, 8, 9,
1, 3, 4, 6, 7, 8, 9,
2, 3, 4, 5,
5};
#endif
#if 0
int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9,
3, 4, 6, 7, 8, 9,
3, 4, 6, 7, 8, 9,
2, 3, 4, 5,
5};
#endif
int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9,
1, 3, 4, 5, 6, 7, 8, 9,
1, 3, 4, 5, 6, 7, 8, 9,
2, 3, 4};
int i;
int r[10] = {0};
int size = sizeof(a) / sizeof(a[0]);
int cnt = 8;
for(i = 0; i < size && cnt; i++){
if(r[a[i]] > 2)
continue;
r[a[i]]++; /* r[a[i]]的取值可能为0, 1, 2, 3 */
if(r[a[i]] == 3){
/* 为3的时候将cnt减1, 减去8个后剩下的那个就是我们要找的数字 */
printf(" %d, %d\n", a[i], r[a[i]]);
cnt--;
}
}
printf("Array size = %d; i = %d; cnt = %d\n", size, i, cnt);
if(cnt == 0) {
/* 其他数字都已经大于2次,现在只剩下1个数字小于或等于2次 */
for(i = 1; i < 10; i++){
if( r[i] <= 2){
printf("ret: %d, repeat times: %d\n", i, r[i]);
break;
}
}
}else {
/* 已经遍历完毕,但小于或等于2次的数字不止1个,找出那个等于2次的 */
for(i = 1; i < 10; i++){
if( 2 == r[i]){
printf("ret: %d, repeat times: %d\n", i, r[i]);
break;
}
}
}
return 0;
}
找重复数字
最新推荐文章于 2019-10-13 21:55:43 发布