網易筆試—按字典序為字串陣列排序
阿新 • • 發佈:2019-02-03
題目要求:字串由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(); }