Off-by-one on range boundaries
Wrong move: Loop endpoints miss first/last candidate.
Usually fails on: Fails on minimal arrays and exact-boundary answers.
Fix: Re-derive loops from inclusive/exclusive ranges before coding.
Build confidence with an intuition-first walkthrough focused on array fundamentals.
You have a bomb to defuse, and your time is running out! Your informer will provide you with a circular array code of length of n and a key k.
To decrypt the code, you must replace every number. All the numbers are replaced simultaneously.
k > 0, replace the ith number with the sum of the next k numbers.k < 0, replace the ith number with the sum of the previous k numbers.k == 0, replace the ith number with 0.As code is circular, the next element of code[n-1] is code[0], and the previous element of code[0] is code[n-1].
Given the circular array code and an integer key k, return the decrypted code to defuse the bomb!
Example 1:
Input: code = [5,7,1,4], k = 3 Output: [12,10,16,13] Explanation: Each number is replaced by the sum of the next 3 numbers. The decrypted code is [7+1+4, 1+4+5, 4+5+7, 5+7+1]. Notice that the numbers wrap around.
Example 2:
Input: code = [1,2,3,4], k = 0 Output: [0,0,0,0] Explanation: When k is zero, the numbers are replaced by 0.
Example 3:
Input: code = [2,4,9,3], k = -2 Output: [12,5,6,13] Explanation: The decrypted code is [3+9, 2+3, 4+2, 9+4]. Notice that the numbers wrap around again. If k is negative, the sum is of the previous numbers.
Constraints:
n == code.length1 <= n <= 1001 <= code[i] <= 100-(n - 1) <= k <= n - 1Problem summary: You have a bomb to defuse, and your time is running out! Your informer will provide you with a circular array code of length of n and a key k. To decrypt the code, you must replace every number. All the numbers are replaced simultaneously. If k > 0, replace the ith number with the sum of the next k numbers. If k < 0, replace the ith number with the sum of the previous k numbers. If k == 0, replace the ith number with 0. As code is circular, the next element of code[n-1] is code[0], and the previous element of code[0] is code[n-1]. Given the circular array code and an integer key k, return the decrypted code to defuse the bomb!
Start with the most direct exhaustive search. That gives a correctness anchor before optimizing.
Pattern signal: Array · Sliding Window
[5,7,1,4] 3
[1,2,3,4] 0
[2,4,9,3] -2
circular-sentence)shortest-distance-to-target-string-in-a-circular-array)take-k-of-each-character-from-left-and-right)Source-backed implementations are provided below for direct study and interview prep.
// Accepted solution for LeetCode #1652: Defuse the Bomb
class Solution {
public int[] decrypt(int[] code, int k) {
int n = code.length;
int[] ans = new int[n];
if (k == 0) {
return ans;
}
for (int i = 0; i < n; ++i) {
if (k > 0) {
for (int j = i + 1; j < i + k + 1; ++j) {
ans[i] += code[j % n];
}
} else {
for (int j = i + k; j < i; ++j) {
ans[i] += code[(j + n) % n];
}
}
}
return ans;
}
}
// Accepted solution for LeetCode #1652: Defuse the Bomb
func decrypt(code []int, k int) []int {
n := len(code)
ans := make([]int, n)
if k == 0 {
return ans
}
for i := 0; i < n; i++ {
if k > 0 {
for j := i + 1; j < i+k+1; j++ {
ans[i] += code[j%n]
}
} else {
for j := i + k; j < i; j++ {
ans[i] += code[(j+n)%n]
}
}
}
return ans
}
# Accepted solution for LeetCode #1652: Defuse the Bomb
class Solution:
def decrypt(self, code: List[int], k: int) -> List[int]:
n = len(code)
ans = [0] * n
if k == 0:
return ans
for i in range(n):
if k > 0:
for j in range(i + 1, i + k + 1):
ans[i] += code[j % n]
else:
for j in range(i + k, i):
ans[i] += code[(j + n) % n]
return ans
// Accepted solution for LeetCode #1652: Defuse the Bomb
struct Solution;
impl Solution {
fn decrypt(code: Vec<i32>, k: i32) -> Vec<i32> {
let n = code.len();
if k == 0 {
return vec![0; n];
}
let mut res = vec![];
for i in 0..n {
let mut sum = 0;
for j in 0..k.abs() {
let index = if k > 0 {
(n as i32 + (i as i32 + 1 + j)) as usize % n
} else {
(n as i32 + (i as i32 - 1 - j)) as usize % n
};
sum += code[index];
}
res.push(sum);
}
res
}
}
#[test]
fn test() {
let code = vec![5, 7, 1, 4];
let k = 3;
let res = vec![12, 10, 16, 13];
assert_eq!(Solution::decrypt(code, k), res);
let code = vec![1, 2, 3, 4];
let k = 0;
let res = vec![0, 0, 0, 0];
assert_eq!(Solution::decrypt(code, k), res);
let code = vec![2, 4, 9, 3];
let k = -2;
let res = vec![12, 5, 6, 13];
assert_eq!(Solution::decrypt(code, k), res);
}
// Accepted solution for LeetCode #1652: Defuse the Bomb
function decrypt(code: number[], k: number): number[] {
const n: number = code.length;
const ans: number[] = Array(n).fill(0);
if (k === 0) {
return ans;
}
for (let i = 0; i < n; ++i) {
if (k > 0) {
for (let j = i + 1; j < i + k + 1; ++j) {
ans[i] += code[j % n];
}
} else {
for (let j = i + k; j < i; ++j) {
ans[i] += code[(j + n) % n];
}
}
}
return ans;
}
Use this to step through a reusable interview workflow for this problem.
For each starting index, scan the next k elements to compute the window aggregate. There are n−k+1 starting positions, each requiring O(k) work, giving O(n × k) total. No extra space since we recompute from scratch each time.
The window expands and contracts as we scan left to right. Each element enters the window at most once and leaves at most once, giving 2n total operations = O(n). Space depends on what we track inside the window (a hash map of at most k distinct elements, or O(1) for a fixed-size window).
Review these before coding to avoid predictable interview regressions.
Wrong move: Loop endpoints miss first/last candidate.
Usually fails on: Fails on minimal arrays and exact-boundary answers.
Fix: Re-derive loops from inclusive/exclusive ranges before coding.
Wrong move: Using `if` instead of `while` leaves the window invalid for multiple iterations.
Usually fails on: Over-limit windows stay invalid and produce wrong lengths/counts.
Fix: Shrink in a `while` loop until the invariant is valid again.