朋友面试的时候一道面试题,感受挺有意思的就来实现下。c++
首先咱们来题目的意思是用abc排4个数,而后只能有2个数重复,有多少种排法?
好比:abca,abcb,abcc,acba面试
要造成这样的4位数,咱们能够在abc中插入a或者b或者c;达到aabc,abac,abca。
思路有了,下面来看看怎么实现。数组
咱们首先须要知道abc在不重复的状况下可以组合几种,abc,acb,bac,bca,cab,cba;6种模式。code
而后遍历原数据abc,依次获取a或b或c,插入到已经的几种混排的方式中国,由于咱们要造成4位数,因此咱们遍历4次,插入的位置依次为0,1,2,3.递归
可是由于 abc,在0的位置插入a,和1的位置插入a,都是aabc,全部有些会是重复的,用new Set()来去重。最后输出结果。方法有了下面咱们来看看代码怎么实现字符串
//初始变量 let array=[]; //输出数组 let str='abc'; //原数据 let len=4; //排列的位数 let b=str.split(''); //把原数据变为数组 let cross=conversion(permutate(str)).length; //获取原数据交叉的不重复的数组
/** * * * @param {any} str //'abc' * @returns */ function permutate(str){ var result=[]; if(str.length==1){ return [str] }else{ var preResult=permutate(str.slice(1)); for(var j=0;j<preResult.length;j++){ for(var k=0;k<preResult[j].length+1;k++){ var temp=preResult[j].slice(0,k)+str[0]+preResult[j].slice(k); result.push(temp) } } return result } }
function conversion(len){ let result=[]; for(var i=0;i<len.length;i++){ let arr=len[i]; result.push(arr.split('')) } return result }
for(var e=0;e<cross;e++){ //获取几种混排方式 for(var i=0;i<b.length;i++){ //获取a,b,c for(var c=0;c<len;c++){ //len 造成4位数的数据,依次插入数据 let getArr=conversion(permutate(str)); let _str=b[i],arr=[]; //_str获取a,b,c arr=getArr[e]; //获取交叉下标为0 arr.splice(c,0,_str); //而后在数组中插入数据 array.push(arr.toLocaleString()); //而后把数据转字符串 } } }
console.log(new Set(array)); //去除重复添加的数据 Set { 'a,a,b,c', 'a,b,a,c', 'a,b,c,a', 'b,a,b,c', 'a,b,b,c', 'a,b,c,b', 'c,a,b,c', 'a,c,b,c', 'a,b,c,c', 'b,a,a,c', 'b,a,c,a', 'b,b,a,c', 'b,a,c,b', 'c,b,a,c', 'b,c,a,c', 'b,a,c,c', 'b,c,a,a', 'b,b,c,a', 'b,c,b,a', 'b,c,a,b', 'c,b,c,a', 'b,c,c,a', 'a,a,c,b', 'a,c,a,b', 'a,c,b,a', 'a,c,b,b', 'c,a,c,b', 'a,c,c,b', 'c,a,a,b', 'c,a,b,a', 'c,b,a,b', 'c,a,b,b', 'c,c,a,b', 'c,b,a,a', 'c,b,b,a', 'c,c,b,a' } console.log(new Set(array).size); //返回数组的长度 36
主要的是思路是在数据中插入一个数据,围绕这个来扩展开来。也但愿你们指点错误,最后也但愿你们喜欢,能够加入qq群439667347,你们一块儿讨论,一块儿进步,后续更新中...get