function partsSums(ls) {
ls.reverse();
let a = 0;
arr = [];
let s = ls.length;
for(let i = s; i--;){
for(let j = ls.length; j--;){
a += ls[j];
}
arr.push(a);
ls.pop();
a = 0;
}
arr.push(0);
return ls ? arr : [0];
}
возникла проблема со скоростью выполнения кода
function partsSums(ls) {
const result = new Array(ls.length + 1);
result[ls.length] = 0;
for (let i = ls.length - 1; i > -1; i--) {
result[i] = result[i + 1] + ls[i];
}
return result;
}
function partsSums(ls) {
ls.unshift(0);
let sum = ls.reduce((p, c) => p + c, 0);
return ls.map(v => sum = sum - v);
}
да, можно и такой вариант использовать, но мне он не нравится по причине того, что придется каждый раз из i вычитать единицу чтобы получить индекс массива.
UPD. Всё же вы правы, оно действительно работает без вычета единицы. Спасибо, в будущем пригодится =)
function partsSums(ls) {
if(ls.length==0) return [0];
result=ls;
result[i=result.length]=0;
i--;
while(i!==-1)
result[i] = result[i+1]+ls[i--];
return result;
}
Test Results:линк
partsSums
Basic tests
Random tests
Completed in 2070ms
RAX7, ... а моё за ~3000ms ¯\_(ツ)_/¯выжмешь ещё круче?)
function partsSums(ls) {
ls.unshift(0);
let sum = ls.reduce((p, c) => p + c, 0);
return ls.map(v => sum = sum - v);
}
const result=[];
const result = new Array(ls.length + 1);
$ node test.js
first for: 141.143ms
----------------------
second for: 1.455s
(() => {
function partsSums1(ls) {
const result = new Array(ls.length + 1);
result[ls.length] = 0;
for (let i = ls.length - 1; i > -1; i--) {
result[i] = result[i + 1] + ls[i];
}
return result;
}
function partsSums2(ls) {
if(ls.length==0) return [0];
const result=[];
result[ls.length] = 0;
let i=ls.length-1;
while(i!=-1)
result[i] = result[i+1]+ls[i--];
return result;
}
const testArr = [];
for(let i = 0; i < 10_000_000; i++) {
testArr.push(~~(Math.random() * 100));
}
console.time('first for');
partsSums1(testArr);
console.timeEnd('first for');
console.log('----------------------')
console.time('second for');
partsSums2(testArr);
console.timeEnd('second for');
})()
вообще в 20 раз вышло
first for: 78.940ms
----------------------
second for: 1536.180ms
где-то в 1.5 раза...
first for: 108.457ms
----------------------
second for: 1.829s
result.length = ls.length + 1;
ты же мутируешь массив, а это не очень хорошо.можешь пояснить для 2-х разных случаев (без привязки к коду):
= [...arr]; // copy array values
= arr; // copy array address
Короче, если ты на 146% уверен, что ни сейчас, ни потом, тебе этот массив не пригодитЯ слежу всегда за этим, разумеется.ься, то можно, а так лучше не стоит.
function partsSums(ls) {
const result = new Int32Array(ls.length + 1);
for (let i = ls.length - 1; i > -1; i--) {
result[i] = result[i + 1] + ls[i];
}
return result;
}
Я слежу всегда за этим, разумеется.
2. Я оптимизировал скорость в ущерб целостности входных данных (вх.массив), т.к. мне больше и не требуется для данной задачи: нужно пройти все тесты за минимально возможное время.
Со всем согласен, но очень не люблю копировать лишний раз (и тратить время+оперативу) тогда, когда использование входных данных - одноразовое/однократное. :)
В рамках данного задания это нормально, но вообще в нормальных задачках мутации запрещены.Кем?)
Это с какими же объёмами данных ты привык работатьЭто не привычка, а необходимость (это не веб-разработка).
Кем?)
Это не привычка, а необходимость (это не веб-разработка).
Только пропихнуть такое на кодворсе не получится, тесты ожидают на выходе обычный массив.Тогда пусть ловят мутации)))