STL系列之十 全排列(百度迅雷笔试题).docVIP

STL系列之十 全排列(百度迅雷笔试题).doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
STL系列之十 全排列(百度迅雷笔试题)

全排列在笔试面试中很热门,因为它难度适中,既可以考察递归实现,又能进一步考察非递归的实现,便于区分出考生的水平。所以在百度和迅雷的校园招聘以及程序员和软件设计师的考试中都考到了,因此本文对全排列作下总结帮助大家更好的学习和理解。对本文有任何补充之处,欢迎大家指出。 首先来看看题目是如何要求的(百度迅雷校招笔试题)。 ? 一.全排列的递归实现 为方便起见,用123来示例下。123的全排列有123、132、213、231、312、321这六种。首先考虑213和321这二个数是如何得出的。显然这二个都是123中的1与后面两数交换得到的。然后可以将123的第二个数和每三个数交换得到132。同理可以根据213和321来得231和312。因此可以知道——全排列就是从第一个数字起每个数分别与它后面的数字交换。找到这个规律后,递归的代码就很容易写出来了: [cpp]?view plaincopy //全排列的递归实现?? #include?stdio.h?? #include?string.h?? void?Swap(char?*a,?char?*b)?? {?? ????char?t?=?*a;?? ????*a?=?*b;?? ????*b?=?t;?? }?? //k表示当前选取到第几个数,m表示共有多少数.?? void?AllRange(char?*pszStr,?int?k,?int?m)?? {?? ????if?(k?==?m)?? ????{?? ????????static?int?s_i?=?1;?? ????????printf(??第%3d个排列\t%s\n,?s_i++,?pszStr);?? ????}?? ????else?? ????{?? ????????for?(int?i?=?k;?i?=?m;?i++)?//第i个数分别与它后面的数字交换就能得到新的排列?? ????????{?? ????????????Swap(pszStr?+?k,?pszStr?+?i);?? ????????????AllRange(pszStr,?k?+?1,?m);?? ????????????Swap(pszStr?+?k,?pszStr?+?i);?? ????????}?? ????}?? }?? void?Foo(char?*pszStr)?? {?? ????AllRange(pszStr,?0,?strlen(pszStr)?-?1);?? }?? int?main()?? {?? ????printf(?????????全排列的递归实现\n);?? ????printf(??--by?MoreWindows(?/MoreWindows?)--\n\n);?? ????char?szTextStr[]?=?123;?? ????printf(%s的全排列如下:\n,?szTextStr);?? ????Foo(szTextStr);?? ????return?0;?? }?? 运行结果如下: 注意这样的方法没有考虑到重复数字,如122将会输出: 这种输出绝对不符合要求,因此现在要想办法来去掉重复的数列。 ? 二.去掉重复的全排列的递归实现 由于全排列就是从第一个数字起每个数分别与它后面的数字交换。我们先尝试加个这样的判断——如果一个数与后面的数字相同那么这二个数就不交换了。如122,第一个数与后面交换得212、221。然后122中第二数就不用与第三个数交换了,但对212,它第二个数与第三个数是不相同的,交换之后得到221。与由122中第一个数与第三个数交换所得的221重复了。所以这个方法不行。 换种思维,对122,第一个数1与第二个数2交换得到212,然后考虑第一个数1与第三个数2交换,此时由于第三个数等于第二个数,所以第一个数不再与第三个数交换。再考虑212,它的第二个数与第三个数交换可以得到解决221。此时全排列生成完毕。 这样我们也得到了在全排列中去掉重复的规则——去重的全排列就是从第一个数字起每个数分别与它后面非重复出现的数字交换。用编程的话描述就是第i个数与第j个数交换时,要求[i,j)中没有与第j个数相等的数。下面给出完整代码: #include stdio.h #include string.h void Swap(char *a, char *b) { char t = *a; *a = *b; *b = t; } //在pszStr数组中,[nBegin,nEnd)中是否有数字与下标为nEnd的数字相等 bool IsSwap(char *pszStr, int nBegin, int nEnd) { for (int i = nBegin; i nEnd; i++) if (

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档