我正在處理 Code Wars 挑戰Missing number in Unordered Arithmetic Progression:
如果您從未聽說過“算術級數”一詞,請參閱之前的代碼挑戰:
算術級數定義為給定數字序列的連續項之間存在恒定差異的級數。[...] 但是有一個問題:在給您的一組數字中,恰好缺少原始系列中的一個術語。給定系列的其余部分與原始 AP 相同。找到缺失的術語。
這是一個無序版本。試試你是否能在大量數字串列中幸存下來(這意味著應該考慮時間限制)。:D
注意:不要害怕串列中的最小或最大元素丟失,例如[4, 6, 3, 5, 2] 丟失1或7,但這種情況被排除在kata之外(即代碼挑戰)。
例子:
find([3, 9, 1, 11, 13, 5]) # => 7
我的解決方案代碼在 99% 的測驗用例中運行良好。然而,具有足夠大輸入的隨機測驗總是超過允許的執行時間。
function find(seq) {
function compareNumbers(a, b) {
return a - b;
}
let arr = [...seq].sort(compareNumbers);
let difference = arr[1]-arr[0];
let arrLen = arr.length;
let i=0;
while(i<arrLen){
if(arr[i 1]-arr[i]!==difference) return arr[i] difference;
i ;
}
}
我想在排序演算法或 while 回圈中有一些改進。我試圖用快速排序演算法替換排序演算法,但這沒有幫助。
uj5u.com熱心網友回復:
由于代碼質詢保證輸入中存在最小值和最大值,因此您可以從以下資訊中得出步驟:
- 最低限度
- 最大
- 長度
給定最小值和步長,您可以輕松地瀏覽期望值的序列并驗證它們是否在輸入值集中。
這是一個實作:
function find(seq) {
let low = seq[0];
let high = low;
for (let i of seq) {
if (i < low) low = i;
else if (i > high) high = i;
}
let step = (high - low) / seq.length;
let set = new Set(seq);
for (let i = low step; i < high; i = step) {
if (!set.has(i)) return i;
}
}
注意:我沒有Math.min(...seq)
在這里使用,因為非常大的陣列會遇到堆疊大小限制。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/496037.html
標籤:javascript 优化
下一篇:如何使用命令讓機器人dm我