其他题目---从N个数中等概率打印M个数
2017-10-30 14:47
106 查看
【题目】
给定一个长度为N且没有重复元素的数组arr和一个整数m,实现函数等概率随机打印arr中的M个数。
【要求】
相同的数不要重复打印
时间复杂度O(M),空间复杂度O(1)
可以改变arr数组
【基本思路】
具体过程如下:
1、在arr[0…N-1]中随机得到一个位置a,然后打印arr[a]。
2、把arr[a]和arr[N-1]交换。
3、在arr[0…N-2]中随机得到一个位置b,然后打印arr,因为打印过的arr[a]已经被换到了N-1位置,所以这次打印不可能在出现。
4、把arr[b]和arr[N-2]交换。
5、在arr[0…N-3]中随机得到一个位置c,然后打印arr[c],因为打印过的arr[a]和arr[b]已经被换到了N-1位置和N-2位置,所以这次打印不可能在出现。
6、依次类推直到打印M个数
总之,就是把随机选出来的数打印出来,然后将打印的数交换到范围中的最后位置,再把范围缩小,使得被打印的数下次不可能再被选中,直到打印结束。
[b]【代码实现】
给定一个长度为N且没有重复元素的数组arr和一个整数m,实现函数等概率随机打印arr中的M个数。
【要求】
相同的数不要重复打印
时间复杂度O(M),空间复杂度O(1)
可以改变arr数组
【基本思路】
具体过程如下:
1、在arr[0…N-1]中随机得到一个位置a,然后打印arr[a]。
2、把arr[a]和arr[N-1]交换。
3、在arr[0…N-2]中随机得到一个位置b,然后打印arr,因为打印过的arr[a]已经被换到了N-1位置,所以这次打印不可能在出现。
4、把arr[b]和arr[N-2]交换。
5、在arr[0…N-3]中随机得到一个位置c,然后打印arr[c],因为打印过的arr[a]和arr[b]已经被换到了N-1位置和N-2位置,所以这次打印不可能在出现。
6、依次类推直到打印M个数
总之,就是把随机选出来的数打印出来,然后将打印的数交换到范围中的最后位置,再把范围缩小,使得被打印的数下次不可能再被选中,直到打印结束。
[b]【代码实现】
#python3.5 def printRandM(arr, m): if arr == None or len(arr) == 0 or len(arr) < m or m < 1: return res = 0 n = len(arr) while res < m: index = int(random.random() * n) print(arr[index], end=' ') arr[index], arr[n-1] = arr[n-1], arr[index] n -= 1 res += 1
相关文章推荐
- 其他题目---一种消息接受并打印的结构设计
- 题目1391:顺时针打印矩阵
- 题目1523:从上往下打印二叉树
- 数学期望和概率DP题目泛做(为了对应AD的课件)
- /*题目:打印出如下图案(菱形)
- 19-题目1126:打印极值点下标
- 【程序19】 题目:打印出如下图案(菱形) * *** ****** ******** ****** *** *
- 题目1126:打印极值点下标
- 题目1090:路径打印
- awk如何打印出除了第一列以外的其他列 ?
- 题目1511:从尾到头打印链表-九度
- 旋转打印矩阵。这个题目我见过很多次都是放弃了。
- 其他题目---邮局选址问题
- 九度OJ 1525 子串逆序打印 -- 2012年Google校园招聘笔试题目
- 题目19:打印极值点下标
- 题目1186:打印日期 九度OJ
- hihoCoder太阁最新面经算法竞赛8 题目2 : Dice Possibility (概率DP)
- 算法题目--顺时针打印矩阵
- 《Linux C编程一站式学习》打印菱形题目
- 把n个骰子扔在地上,所有骰子朝上一面的点数之和为S。输入n,打印出S的所有可能的值出现的概率