1291.回避頻度
難易度:中
「順序の順序」を次のように定義します。各桁の数値は、前の桁の数値より1大きい整数です。
[低、高]の範囲のすべての注文番号で構成される注文リスト(最小から最大の順に並べ替え)を返送してください。
例1:
出力:低= 100、高= 300
出力:[123,234]
例2:
出力:低= 1000、高= 13000
出力:[1234,2345,3456,4567,5678,6789,12345]
促す:
10 <=低<=高<= 10 ^ 9
回答
方法一:穷举
/**
* @param {number} shorter
* @param {number} longer
* @param {number} k
* @return {number[]}
*/
var sequentialDigits = function(low, high) {
let res = [],
index = 0;
for (let i = 1; i <= 9; i++) {
let n = i;
for (let j = i + 1; j <= 9; j++) {
n = n * 10 + j;
if (n >= low && n <= high) {
res[index++] = n;
}
}
}
//由于穷举后的数并不是由小到大,所以需要进行排序
return res.sort(function(a,b){
return a-b;});
};
方法二:剪枝
var sequentialDigits = function(low, high) {
let res = []
let lowLen = low.toString().length
let highLen = high.toString().length
for(let i=lowLen;i<=highLen;i++){
for(let j=1;j<=10-i;j++){
//剪枝:首位数不会大于10-i
let str = ''
let num = j
str += num
let k = i-1
while(k--){
num++
str += num
}
let ans = parseInt(str)
if(ans>=low && ans<=high){
res.push(ans)
}
}
}
return res
};
分析
質問から、桁数が前の桁より1桁多いことがわかります。定義ドメインを満たしたい場合は、条件を満たしていれば、徹底的な方法を使用して配列をトラバースして入力できます。入力した数字は小さいものから大きいものまでありませんはい、最後に並べ替える必要があります。
徹底的な方法は簡単ですが、時間がかかりすぎます。剪定もここで行うことができます。
[100,1000]のシーケンス番号を出力する場合は、最初にtoString()。lengthを使用して数値を文字列に変換してから、長さ、つまりデータの桁数に到達できることを確認します。 100は3桁、1000は4桁の数値、つまりi> = 3 && i <= 4です。
100から1000までの3桁があり、一致する注文の最大数は789であり、後続の注文はありません。つまり、最初の桁が7の789が存在し、最初の8.9が存在しないため、存在しません。この10-3(i)= 7の場合、剪定できるようにトラバースが必要です。