今天面试遇到的题,题目要求,往a[100]中插入1-100的数字,要求每个数字都不同且无规律。
我说了两种思路,然后第一种方法,初始化a[100]={0},然后每生成一个随机数与之前插入的数字比较,如果相同则重新生成,时间复杂度为n*n,然后面试官这个不够高效,他说插入最后一个元素时你可能要随机生成多次。
然后我昨天看了下stl里的东西,set里布允许有重复元素,所以我想到了思路二,可以生成随机数往set里插入,当set的size()到100时停止,然后我刚写得代码如下,结果却不是我想要的结果。
int main()
{
set<int> nums;
srand((unsigned int)time(nullptr));
while(nums.size()<100)
{
nums.insert(random()%100+1);
}
for(auto &i:nums)
cout<<i<<" ";
return 0;
}
输出结果为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
生成种子放在while内和while外都是一个结果,跪求分析程序的问题所在.
有个问题叫做“完美洗牌”,意思是说,一副牌去掉大小王还剩52张,现在要洗这52张牌。显然,洗牌共有52!种结果。完美洗牌要求52!种洗牌结果出现的概率相同。
有没有感觉很像?这道面试题要求数字分布“无规律”,也就是要求每种结果出现的概率满足随机均匀分布。所以这道题目相当于完美洗牌,只不过要洗100张牌。
简单起见,以5张牌为例:A, B, C, D, E,问题是,能否在完美洗前4张牌的基础上,把战果扩大为完美洗5张牌呢?如果可以,那么我们就可以用迭代或者递归解决完美洗牌问题。幸好,答案真的是“可以”。
假设A, B, C, D已经实现了完美洗牌,现在来了第5张牌E,可以在A, B, C, D中随机挑选一张牌,即rand(0, 3),然后将这张牌和E交换,于是这5张牌就实现了完美洗牌。
用C++解决这道题目:
结果如下所示: