Javascript Array Bug - при изменении одного изменяются все остальные массивы - PullRequest
1 голос
/ 05 мая 2020

Я занимался проблемой Codeforces, когда обнаружил ошибку, которую, собственно, не знаю, как исправить:

Проблема:

Вася придумал новую функцию ha sh массива. Он рассчитывается следующим образом. Хотя в массиве есть как минимум два элемента, первые два элемента, назовите их ?1 и ?2, удаляются, а новый элемент ?2-?1 вставляется в начало массива. Когда в массиве всего один элемент, это число является значением функции Васи ha sh этого массива.

У Васи есть массив ?1, ?2, ..., ??. Он выполняет ? операций следующего вида: «увеличить все элементы отрезка [??, ??] на ??». После каждой операции он хочет узнать значение функции Васи ha sh этого массива.

Входные данные: Первая строка содержит целое число ? (1≤?≤500000) - размер массива. Во второй строке записаны ? целых чисел ?? (−109≤??≤109) - элементы массива. В третьей строке записано целое число ? (1≤?≤200000) - количество операций. В каждой из следующих ? строк записано три целых числа ??, ??, ?? (1≤??≤??≤?, −109≤??≤109) - параметры ?-й операции.

Вывод: Вывод линий. В ?-й строке выведите одно целое число - значение функции Васи ha sh после ?-й операции.

При изменении массива (как внутри, так и вне while l oop) автоматически изменяется и весь остальной массив.

Я действительно не знаю, что попробовать и как это исправить.

function hash(n, inputArray, q, operations){

    let result = [];

    for (const operation of operations) {   
        let new_array = array_operation(inputArray, operation[0], operation[1], operation[2]);

        while (new_array.length >= 2) {
            let new_value = new_array.shift() + new_array.shift();
            new_array.unshift(new_value);
        }

        result.push(new_array.shift());
    }
    return result;
}

function array_operation(array, start, end, value){
    for (const i in array) if (i >= --start && i < end) array[i] += value;
    return array;
}

console.log(hash(7, [4, 2, -5, 10, 4, -2, 6], 2, [[2, 4, -8,], [5, 7, 2], [3, 3, -1], [3, 7, 3]])); 

Ответы [ 2 ]

1 голос
/ 05 мая 2020

Просто клонируйте new_array вместо того, чтобы использовать тот же массив для выполнения операций, поскольку shift изменяет исходный массив.

function array_operation(array, start, end, value) {
    let cloned_array = [...array];   

    for (const i in cloned_array) {
        if (i >= --start && i < end) {
           cloned_array[i] += value;
        }
    }

    return array;
}
0 голосов
/ 05 мая 2020

Может это исправить.

function array_operation(array, start, end, value){
    for (const i in array) if (i >= --start && i < end) array[i] += value;
    return [...array];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...