朋友面試的時候一道面試題,感受挺有意思的就來實現下。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