列出a,b,c的全部4位數排序可能。如:abca,abcb,abcc,acba(面試題)

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

相關文章
相關標籤/搜索