题目要求:字符串由n个'a',m个'z'组成,对所有可能出现的字符串按照字典序排列,找出第K个字符串。
思路:
- 生成所有可能的字符串数组
- 对数组排序
- 找出对应的第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();
}