1. 程式人生 > >網易筆試—按字典序為字串陣列排序

網易筆試—按字典序為字串陣列排序

題目要求:字串由n個'a',m個'z'組成,對所有可能出現的字串按照字典序排列,找出第K個字串。

思路:

  1. 生成所有可能的字串陣列
  2. 對陣列排序
  3. 找出對應的第k個字串
sort(),陣列按字母順序對陣列中的元素進行排序,說得更精確點,是按照字元編碼的順序進行排序。
生成所有可能的字串陣列:遞迴。對於ab的排列值,先求出b的排列值,然後將a放置與b之前和b之後,得到ab的排列值。
對於abc的排列值,先求出bc的所有排列值,然後將a放置於後兩個數的之前/之中/之後三個位置之一,得到abc的所有排列值。以此類推。arguments.callee:是獲取當前呼叫函式的本體。匿名函式,代表函式名,多用於遞迴呼叫
//測試
var str = getStr(2,3,5);
console.log(str);

//入口
function getStr(n,m,k) {
    var arrStr = '';
    for(var i=0;i<n;i++){
        arrStr += 'a';
    }
    for(var j=0;j<m;j++){
        arrStr += 'z';            //獲取的字串:"aaaazzzz"
    }

    console.log(arrStr);    

    var arr = getArr(arrStr);  //生成所有可能結果
    console.log(arr);

    var arr1 = getUniqueArr(arr);   //陣列去重
    console.log(arr1);

    var arr3 = sortArr(arr1);    //陣列排序
    console.log(arr3);

    if(k<arr3.length){
        return arr3[k];
    }else{
        console.log("陣列中不存在指定字串")
    }

}
//獲取陣列
function getArr(str) {
    if(str.length == 1 || str.length == 0 ){
        return [str];
    }

    var result = [];
    var partArr = arguments.callee(str.slice(1));   //用arguments.calle代替匿名函式,自己呼叫自己      slice(1):擷取從1開始到結尾的字元
    for(var i=0;i<partArr.length;i++){
        for(var j=0;j<partArr[i].length+1;j++){//加1的目的是讓字元one也可以插入到最後一個位置
            result.push(partArr[i].slice(0,j) + str[0] + partArr[i].slice(j));    //slice(0,j):擷取0-j的字元;
        }
    }
    return result;
}

//陣列去重
function getUniqueArr(arr) {
    var hashTable = {};
    var data = [];
    for(var i=0;i<arr.length;i++){
        if(!hashTable[arr[i]]){
            hashTable[arr[i]] = true;
            data.push(arr[i]);
        }
    }
    return data;
}

//陣列排序
function sortArr(arr) {
    return arr.sort();
}