【申明:本文仅限于自我归纳总结和相互交流,有纰漏还望各位指出。 联系邮箱:Mr_chenping@163.com】
题目:数组a[N],存放了1至N-1个数,其中某个数重复一次。写一个函数,找出被重复的数字.时间复杂度必须为o(N)。
题目分析:
一、数组存放数值可以是有序,也可以是乱序
二、时间复杂度要求为0(N),因而只能循环一次
算法实现:
#include <stdio.h>
/*
** 数组a[N],存放了1至N-1个数,其中某个数重复一次。写一个函数,
** 找出被重复的数字.时间复杂度必须为o(N)
*/
#include <stdio.h>
#include <stdlib.h>
int do_dup1(int a[], int N)
{
int i=0;
int sum1 = 0, sum2 = 0;
for(; i<N; ++i)
{
sum1 += i;
sum2 += array[i];
}
return sum2 - sum1;
}
int do_dup2(int a[], int N)
{
int j,i;
int *new_array = (int *)malloc(N*sizeof(int));
//初始化数组,这里复制-1,因为题目规定最小值为1
for(j=0; j<N; j++)
{
new_array[j] = -1;
}
for(i=0; i<N; i++)
{
if(new_array[a[i]] == -1)
{
new_array[a[i]] = a[i];
}
else
{
return a[i];
}
}
free(new_array);
return 0;
}
int main()
{
int arry[] = {2, 5, 6, 4, 3, 5, 1};
int result;
result = do_dup1(arry, 7);
printf("The result %d\n", result);
result = do_dup2(arry, 7);
printf("The result %d\n", result);
return 0;
}