自用笔记53——随机数

在大小为 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表法,当某一个数出现超过两次时,即为所找的数

上一篇:剑指 Offer 53 - I. 在排序数组中查找数字 I


下一篇:Python - 装机系列53 容器内调用宿主机docker