Задачи
January 24
Task. Разминировать бомбу
Задача. Необходимо разминировать бомбу. У вас есть код в виде кругового массива длиной N и ключ k. Чтобы расшифровать код, нужно заменить каждое число. Все числа заменяются одновременно.
- Если k > 0, замените i-е число суммой следующих k чисел.
- Если k < 0, замените i-е число суммой предыдущих k чисел.
- Если k == 0, замените i-е число на 0.
Необходимо вернуть расшифрованный код.
Пояснение: в циклическом массиве следующий элемент после arr[N - 1] - это arr[0]. Соответственно, предыдущий элемент для arr[0] - это arr[N - 1].
Входные данные: размер массива, а также элементы массива - значения от 0 до 100.
- arr [5,7,1,4], k = 3
Output: [12,10,16,13]
Пояснение: [7+1+4, 1+4+5, 4+5+7, 5+7+1] - arr = [2,4,9,3], k = -2
Output: [12,5,6,13]
Пояснение: [3+9, 2+3, 4+2, 9+4]
Разбор
- k == 0. Если ключ равен нулю, то по условию все элементы заменяются на 0.
- k > 0. Для каждого элемента массива суммируем k последующих элементов, учитывая круговой характер массива. При выходе за пределы индекса массива, используем модуль % для перехода к началу.
- k < 0. Для каждого элемента массива суммируем |k| предыдущих элементов. Переход к началу массива также выполняется с помощью индексации %.
Реализация
static int[] DefuseBomb(int[] arr, int k) { int N = arr.Length; var res = new int[N]; if (k == 0) { return res; } for (int i = 0; i < N; i++) { if (k > 0) { for (int j = i + 1; j < i + k + 1; j++) { res[i] += arr[j % N]; } } else { for (int j = i - Math.Abs(k); j < i; j++) { res[i] += arr[(j + N) % N]; } } } return res; }
https://gist.github.com/unilecs/69dff66f69bf3b70780ad4291b1b66bc