我正在查看CodeWars 上的零件總和問題:
讓我們考慮這個例子(以通用格式撰寫的陣列):
ls = [0, 1, 3, 6, 10]其以下部分:
ls = [0, 1, 3, 6, 10] ls = [1, 3, 6, 10] ls = [3, 6, 10] ls = [6, 10] ls = [10] ls = []相應的總和是(放在一個串列中):
[20, 20, 19, 16, 10, 0]該函式
parts_sums(或其在其他語言中的變體)將采用串列 ls 作為引數,并回傳上面定義的各部分總和的串列。
該函式的目標是對陣列的元素求和,然后每次移動陣列的第一個元素,直到陣列的長度變為 0。
我有這個解決方案:
function partsSums(ls) {
let len = ls.length;
let arr = [];
for (let i = 0; i < len 1; i ) {
arr.push(summation(ls));
ls.shift();
}
function summation(a) {
let sum = 0;
for (let i = 0; i < a.length; i ) {
sum = a[i];
}
return sum;
}
return arr;
}
它在我的編輯器中運行時有效:CodeWars 上成功完成的所有測驗用例都通過了,但是當我嘗試提交時,出現此錯誤:
行程被終止。完成耗時超過 12000 毫秒
我是演算法新手,無法理解錯誤在哪里?歡迎任何建議。
uj5u.com熱心網友回復:
該函式的目標是對陣列的元素求和,然后每次移動陣列的第一個元素,直到陣列的長度變為0
代碼挑戰實際上并??不涉及shift。您可以在不移動的情況下完成此操作,方法是將值立即存盤在結果陣列的正確索引處。此外,您的函式summation正在重復對某些相同的值求和。這是可以避免的。
拿這個例子:
ls = [0, 1, 3, 6, 10]
輸出可以構造如下:
創建一個長度為一個元素的陣列,并在末尾具有值 0:
ls: 0 1 3 6 10 result: . . . . . 0(這些點的值此時不相關)
然后從右側開始,創建一個(向后)運行總和:
ls: 0 1 3 6 10 result: ↓ ↓ ↓ ↓ ↓← 0 ↓ ↓ ↓ ↓←10 ↓ ↓ ↓←16 ↓ ↓←19 ↓←20 20因此,將索引 i 1 處的先前結果添加到索引 i 處的輸入中,因此它向后作業到陣列的開頭。
這是一個實作:
function partsSums(ls) {
let result = Array(ls.length 1).fill(0);
for (let i = ls.length - 1; i >= 0; i--) {
result[i] = ls[i] result[i 1];
}
return result;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/401117.html
標籤:javascript 算法 表现 优化
上一篇:復雜聚合的ElasticsearchSpringData和ElasticsearchHighLevelClient性能
