在大小为 2N 的数组 A 中有 N+1 个不同的元素,其中有一个元素重复了 N 次。
返回重复了 N 次的那个元素。
示例 1:
输入:[1,2,3,3]
输出:3
示例 2:
输入:[2,1,2,5,3,2]
输出:2
示例 3:
输入:[5,1,5,2,5,3,5,4]
输出:5
提示:
4 <= A.length <= 10000
0 <= A[i] < 10000
A.length 为偶数
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/n-repeated-element-in-size-2n-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
int cmp(const void *a,const void *b)
{
return *(int *)a - *(int *)b;
}
int repeatedNTimes(int* A, int ASize){
qsort(A,ASize,sizeof(A[0]),cmp);
if(A[0] == A[ASize/2-1])
return A[0];
else if(A[ASize/2] == A[ASize-1])
return A[ASize-1];
else
return A[ASize/2];
}
如果用随机数法,随机产生两个下标,如果两个数相等,则返回该值
int repeatedNTimes(int* A, int ASize){
srand((unsigned)time(NULL));
int a, b;
while(true) {
a = rand()%ASize;
b = rand()%ASize;
if (a!=b&&A[a]==A[b]) {
return A[a];
}
}
return 0;
}
rand() 会随机生成一个位于 0 ~ RAND_MAX 之间的整数。
RAND_MAX 是 <stdlib.h> 头文件中的一个宏,它用来指明 rand() 所能返回的随机数的最大值。C语言标准并没有规定 RAND_MAX 的具体数值,只是规定它的值至少为 32767。在实际编程中,我们也不需要知道 RAND_MAX 的具体值,把它当做一个很大的数来对待即可。
srand() 的用法为:
void srand (unsigned int seed);
它需要一个 unsigned int 类型的参数。在实际开发中,我们可以用时间作为参数,只要每次播种的时间不同,那么生成的种子就不同,最终的随机数也就不同。
使用 <time.h> 头文件中的 time() 函数即可得到当前的时间(精确到秒),就像下面这样:
srand((unsigned)time(NULL));
当然也可以用Hash表法,当某一个数出现超过两次时,即为所找的数