网易笔试—按字典序为字符串数组排序

题目要求:字符串由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();
}
点赞