还记得这三个面试题吗?一次搞定,造福新人

简介:

一、输出全排列
1、全排列是将一个集合按一定顺序进行排列,如果这个集合有n个元素,那么全排列数为n!个。
2、举例来说,有字符串数组{"x","y","z"},那么该数组对应的全排列就是xyz,xzy,yxz,yzx,zxy,zyx。有人会问,如果集合是{"x","x","z"},那么该数组对应输出的全排列难道是xxz,xzx,xxz,xzx,zxx,zxx吗?按照全排列的定义,是的,我们不关心输出有重复的情况。
3、全排列生成的通项公式
现在我们依照第2步分析归纳全排列的通项公式。为了说明的需要,这一次都从集合的最后一个元素逆向推导,分析如下:
数组有1个元素: {"x"}    对应全排列 x;
数组有2个元素: {"y"."x"}   对应全排列 xy,yx,就是以x开头的y的全排列的组合和以y开头的x的全排列的组合
数组有3个元素: {"z","y","x"}   对应全排列  xyz,xzy,yxz,yzx,zxy,zyx 
就是以x开头的y、z的全排列的组合,以y开头的x、z的全排列的组合,以z开头的x、y的全排列的组合
......
依次类推,从而可以推断,设一个数组集合arr = {ele0, ele1, ele2, ... ,ele(n-1)}(n个元素,0,1,2,...n-1为下标), 全排列表示为xyz(arr),数组关系:dstArri = arr - {ele[i]},
即原数组arr去掉一个元素,剩下长度n-1的数组dstArri.
因此xyz(arr) = arr[0]xyz(dstArr0), arr[1]xyz(dstArr1), ... ,arr[i]xyz(dstArri), ...。当i=0时xyz(arr) = ele0。
那么如何实现呢?分析一下arr[i]xyz(dstArri),你可以发现它的规律,就是:将整组中的所有的元素分别与第一个元素交换,这样就总是在处理后n-1个元素的全排列。没错,就是利用递归实现。
4、实现代码
a、c#实现输出集合的全排列

ContractedBlock.gif Code

b、javascript实现输出集合的全排列

ContractedBlock.gif Code

ps:我们都知道程序中利用递归不当,可能会导致缓冲区溢出。期待高手非递归版本的全排列算法。
二、c#实现数组某段区间元素的交换(o(1)复杂度)
前言:这个纯粹是从老赵那里拿来的,也在我做过的一道笔试题里变相的出现了一下(原题是字符串反转)。这里再贴一次,加深印象。
问题:有一个数组arr,将arr数组元素从start下标到end下标之间的元素反序一下。
举例来说,一个数组初始值是[1, 2, 3, 4, 5, 6,7,8,9,10],start为1,end为5,那么当调用了Reverse之后,
arr数组中的元素便依次成为[1, 6, 5, 4, 3, 2,7,8,9,10],其中从arr[1]到arr[5]之间(含arr[5])的元素被反序了。
下面是c#实现代码:

ContractedBlock.gif Code

ps:关于数据元素交换肯定不止这一种方法,不过从算法复杂度角度考虑,这一种是很值得提倡的。
三、NC的计算斐波那契数列的第N位
这个NC问题是昨天看到博客园里一位园友的最近遇到的两个面试题兼卖身广告又想起来的。想当初刚毕业那会,被这个面试问题qj很多次,这里贴出递归和迭代两种算法。高手不值一哂,新手也不要当回事,真正的NC问题,哈哈。

ContractedBlock.gif Code

 





本文转自JeffWong博客园博客,原文链接:http://www.cnblogs.com/jeffwongishandsome/archive/2009/08/21/1502715.html,如需转载请自行联系原作者

目录
相关文章
|
10月前
|
JavaScript 前端开发 Java
【程序员小白入门】这几个宝藏菜鸟教程网站记得收藏!!!
其实菜鸟教程相关的网站内容都大同小异,推荐这几个原因是页面交互比较简单,重要的是没有任何广告。
|
10月前
在编程路上不忘初心
在编程路上不忘初心
|
人工智能 运维 安全
程序员们平时都喜欢逛这些论坛
程序员们平时都喜欢逛这些论坛
184 0
程序员们平时都喜欢逛这些论坛
|
小程序 测试技术
【技巧】软件测试的面试这些技巧记得不要错过了
拥有一个心仪的offer,是每个软件测试工程师们都梦寐以求的事情,那如何才能通过最后的面试一关,拿到offer呢? 俗话说,知己知彼百战不殆,作为测试员,在面试前对面试官可能提出的问题进行总结和准备,是帮助我们取得好成绩的最佳方式,所以,这些有关软件测试的面试技巧记得不要错过了!
113 0
乘风者计划的体会
体会了计划后,颇有感触,更加了解计算机的历史,更加明白了科技对于国家的发展有多大的影响,更坚定了我对计算机的魅力加深,在未来的学习希望能提高自我学习的能力,促进自身发展,为社会做出自己的贡献,我国科技实力和创新能力的全面提升,为经济发展、民生改善和国家安全提供了重要支撑,为推进科技自立自强、建设科技强国开辟了广阔空间,我们比历史上任何时期都更有能力、更有底气实现高水平科技自立自强,对于计划的实现表示感谢,感谢能有这个机会让自己去追求梦想,感谢阿里云这个平台,为我们大学生提供更多的帮助,更能为我们增加信心去大放异彩和展现自己,我也会把握这次机遇,更加努力的学习,报答祖国
|
小程序 前端开发 程序员
讨老婆开心,阿里云程序员的方式,竟然是…
阿里坚持每年都举办集体婚礼,还得从“阿里日”开始说起。 2003年“非典”期间,因一位员工被确诊“疑似”,全体阿里员工必须搬着电脑回家隔离办公。为纪念那段艰苦岁月中的坚韧坚持,感恩家人的温暖支撑,2005年起,阿里决定将每年的5月10日设立为“阿里日”,并从2006年起,每年举办员工集体婚礼。 当阿里集体婚越来越受到阿里人追捧时, “公益”成为集体婚礼另一个重要的关键词。每年累计公益时长最高的两对夫妻,可以免于抽签,直接参加集体婚礼。 为了给妻子王若芸一个别致却更有意义的婚礼,这一年,阿里云程序员驿桥积累了599个公益时,这是他和妻子的爱情故事。
303 0
讨老婆开心,阿里云程序员的方式,竟然是…
感想与体会
文中讲述本人学习网页制作的经历、感想与体会
150 0
|
SQL 算法 NoSQL
编写代码最应该做好的事情是什么?(备战2022春招或暑期实习,每天进步一点点,打卡100天,Day8)
编写代码最应该做好的事情是什么?(备战2022春招或暑期实习,每天进步一点点,打卡100天,Day8)
127 0
编写代码最应该做好的事情是什么?(备战2022春招或暑期实习,每天进步一点点,打卡100天,Day8)
|
移动开发 前端开发 JavaScript
【新人福利】前端学习路线,再也不用发愁自己该从何学习
【新人福利】前端学习路线,再也不用发愁自己该从何学习
218 0
【新人福利】前端学习路线,再也不用发愁自己该从何学习
|
Java Unix 数据库
程序员技术练级攻略
月光博客6月12日发表了《写给新手程序员的一封信》,翻译自《An open letter to those who want to start programming》,我的朋友(他在本站的id是Mailper)告诉我,他希望在酷壳上看到一篇更具操作性的文章。
2317 0