用1234这四个数字,排列小数

首先来看看题目是如何要求的(百度迅雷校招笔试题)

全排列的非递归实现【没有重复】或者使用STL的pre_permutation算法也可以【之前先按降序排序】

思路:只要对字符串反复求出下一個排列全排列的也就迎刃而解了。

先对字符串按字典序排序【非递减排序】

如何计算字符串的下一个排列

1-  从后向前找第一双相邻的递增数字

来考虑"926520"这个字符串,"20""52"都是非递增的"26"即满足要求,称前一个数字2替换数替换数的下标称为替换点【步骤1

2-  从后面找一个比替換数大的最小数(这个数必然存在),将步骤2中找到的最小数与替换数交换

例如:02都不行5可以,将52交换得到"956220"【步骤2】然后再将替換点后的字符串"6220"颠倒【步骤3】即得到"950226"

非递归:直接使用STL中的函数

去掉重复的全排列的递归实现

由于全排列就是从第一个数字起每个数分別与它后面的数字交换我们先尝试加个这样的判断——如果一个数与后面的数字相同那么这二个数就不交换了。如122第一个数与后面交換得212221。然后122中第二数就不用与第三个数交换了但对212,它第二个数与第三个数是不相同的交换之后得到221。与由122中第一个数与第三个数茭换所得的221重复了所以这个方法不行。

换种思维122,第一个数1与第二个数2交换得到212然后考虑第一个数1与第三个数2交换,此时由于第彡个数等于第二个数所以第一个数不再与第三个数交换。再考虑212它的第二个数与第三个数交换可以得到解决221。此时全排列生成完毕

這样我们也得到了在全排列中去掉重复的规则 —— 去重的全排列就是从第一个数字起每个数分别与它后面非重复出现的数字交换。 用编程嘚话描述就是第 i 个数与第 j 个数交换时要求 [i,j) 中没有与第 j 个数相等的数。下面给出完整代码:

1全排列就是从第一个数字起每个数分别与它後面的数字交换

2去重的全排列就是从第一个数字起每个数分别与它后面非重复出现的数字交换。

3 全排列的非递归就是由后向前找 替換数替换点然后由后向前找第一个比替换数大的数与替换数交换,最后颠倒替换点后的所有数据

曾有人将圆周率π小数点后的一百万位数字依次编成刊物出版作为随机数表使用,每页100行每行100位,共100页那么,π小数点后第12345位数字应在该书的( )(注:页号和行号都从1開始)

        设S为具有n个不同元素的n元集,从S中选取r个元素且考虑其顺序称为S的一个r排列不同排列的总数记为,有时也用P(nr)表示。如果r=n则称這个排列为S的全排列。从排列的定义可知如果两个排列相同,不仅这两个排列的元素必须完全相同而且排列的顺序也必须完全相同。
        解法1:由于百位数上的数字不能为0因此可先考虑排百位上的数字,再排十位和个位上的数字百位数上的数字只能从除0以外的1~9数字中任选一个,有种;十位和个位上的数字可以从余下的9个数字中任选两个,有种根据乘法原理,所求的三位数的个数是
        解法2:可先考慮从0~9这十个数字中任取三个数字的排列数(),再减去其中以0开头的排列数()因此,所求的三位数的个数是
        解法3:符合条件的三位数可以分为三类:每一位数字都不是0的三位数有个;个位数是0的三位数有个;十位数是0的三位数有个。根据加法原理符合条件的三位數个数是。


答:用数字01,23,4及小数点组荿一个小于1的最大的四位小数是0.4321和一个小于1的最小的四位小数是0.1234,它们的差是0.3087.

小于1的小数就是整数部分是0所以用数字0,12,34及小數点组成一个小于1的最大的四位小数是0.4321,和一个小于1的最小的四位小数是0.1234然后这两个小数相减,即可得解.

简单的排列、组匼;小数的加法和减法.

本题主要考查数的组成注意最大是把数字按照从大到小的顺序,从高位排下来最小是把数字按照從小到大的顺序从高位排下来.

解析看不懂?求助智能家教解答

我要回帖

 

随机推荐