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

简介:

一、输出全排列
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#实现输出集合的全排列

Code

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

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#实现代码:

Code

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

Code

 





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

目录
相关文章
|
8月前
|
前端开发 程序员 开发工具
2024年最全0基础程序员如何快速进阶成为编程老司机?_码农速成(2),字节跳动面试攻略
2024年最全0基础程序员如何快速进阶成为编程老司机?_码农速成(2),字节跳动面试攻略
2024年最全0基础程序员如何快速进阶成为编程老司机?_码农速成(2),字节跳动面试攻略
|
设计模式 算法 中间件
劲爆!阿里巴巴面试参考指南(嵩山版)开源分享,程序员面试必刷
近几年受疫情影响各行各业的日子都不好过,虽然程序员日子也挺难,但是好在可以线上面试、线上办公,影响还是比较小的,但是去年教育行业的 “双减” 政策,导致又一大批岗位缺失程序员竞争压力突然递升;
|
前端开发 小程序 网络协议
面试刷题哪里找?这个软件测试题库小程序太香了!
现如今,不仅学习卷、考证卷,就连找工作也开始卷得没边了。就如最近几年新崛起的软件测试岗位,很多人为了能过快速通过面试,或者拿到offer,纷纷在面试前几周左右,不惜花重金,购买面试题目,开始疯狂地刷题、背题。
297 0
|
小程序 测试技术 Python
软件测试面试题及答案 这个可以免费白嫖的题库不要错过了
对于很多新手软件测试人来说,除了掌握扎实的专业技能之外,你还需要一份个互联网软件测试工程师面试题库才能在万千面试者中杀出重围,成功拿下offer。
187 0
|
机器学习/深度学习 存储 算法
写给小白看的硬核递归(低调点,当回小白)
递归:就是函数自己调用自己。 子问题须与原始问题为同样的事,或者更为简单。 递归通常可以简单的处理子问题,但是不一定是最好的解决方式。
101 0
|
移动开发 前端开发 JavaScript
【新人福利】前端学习路线,再也不用发愁自己该从何学习
【新人福利】前端学习路线,再也不用发愁自己该从何学习
265 0
【新人福利】前端学习路线,再也不用发愁自己该从何学习
|
存储 前端开发 JavaScript
前端面试篇,应届生面试时被问项目经验不用慌,按这个步骤回答成功率高达95%
前端面试篇,应届生面试时被问项目经验不用慌,按这个步骤回答成功率高达95%
459 0
|
缓存 架构师 NoSQL
程序员面试 10 大潜规则,千万不要踩坑!
很多刚入行的小伙伴特别容易犯的一个错误,不清楚面试官到底想问什么,其实整个面试中面试官并没有想难道你的意思,只是想通过提问的方式来知道你会什么
|
数据采集 前端开发 Java
阿里面试官分享+真实面经+笔试模拟题,面试充电,就看这篇|开发者必读(165期)
阿里面试官分享+真实面经+笔试模拟题+招聘信息汇总,太全了!你确定不看?你确定不收藏?你确定不转发?
|
SQL JavaScript 前端开发
2020 开春程序员面试必备!拿走不谢!
作为前端的主要编程语言,JavaScript出现在14.5%的技术岗位招聘信息中。它不仅是一种广受欢迎的技能,也是使用最多的编程语言,69.7%的专业开发人员经常使用它编写代码。