Skip to content

Commit 7ac3c65

Browse files
authored
feat: add solutions to lc problem: No.1652 (#2721)
No.1652.Defuse the Bomb
1 parent 8dc4f4b commit 7ac3c65

File tree

4 files changed

+125
-77
lines changed

4 files changed

+125
-77
lines changed

solution/1600-1699/1652.Defuse the Bomb/README.md

Lines changed: 43 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -173,35 +173,26 @@ func decrypt(code []int, k int) []int {
173173

174174
```ts
175175
function decrypt(code: number[], k: number): number[] {
176-
const n = code.length;
176+
const n: number = code.length;
177+
const ans: number[] = Array(n).fill(0);
178+
177179
if (k === 0) {
178-
return code.fill(0);
179-
}
180-
const isPrefix = k < 0;
181-
if (isPrefix) {
182-
k *= -1;
183-
}
184-
const map = new Map<number, [number, number]>();
185-
let prefix = 0;
186-
let suffix = 0;
187-
for (let i = 1; i <= k; i++) {
188-
prefix += code[n - i];
189-
suffix += code[i];
190-
}
191-
map.set(0, [prefix, suffix]);
192-
193-
for (let i = 1; i < n; i++) {
194-
let [p, s] = map.get(i - 1);
195-
p -= code[n - k - 1 + i] ?? code[i - k - 1];
196-
p += code[i - 1];
197-
s -= code[i];
198-
s += code[i + k] ?? code[i + k - n];
199-
map.set(i, [p, s]);
180+
return ans;
200181
}
201-
for (let i = 0; i < n; i++) {
202-
code[i] = map.get(i)[Number(!isPrefix)];
182+
183+
for (let i = 0; i < n; ++i) {
184+
if (k > 0) {
185+
for (let j = i + 1; j < i + k + 1; ++j) {
186+
ans[i] += code[j % n];
187+
}
188+
} else {
189+
for (let j = i + k; j < i; ++j) {
190+
ans[i] += code[(j + n) % n];
191+
}
192+
}
203193
}
204-
return code;
194+
195+
return ans;
205196
}
206197
```
207198

@@ -308,6 +299,32 @@ func decrypt(code []int, k int) []int {
308299
}
309300
```
310301

302+
```ts
303+
function decrypt(code: number[], k: number): number[] {
304+
const n: number = code.length;
305+
const ans: number[] = Array(n).fill(0);
306+
307+
if (k === 0) {
308+
return ans;
309+
}
310+
311+
const s: number[] = Array((n << 1) | 1).fill(0);
312+
for (let i = 0; i < n << 1; ++i) {
313+
s[i + 1] = s[i] + code[i % n];
314+
}
315+
316+
for (let i = 0; i < n; ++i) {
317+
if (k > 0) {
318+
ans[i] = s[i + k + 1] - s[i + 1];
319+
} else {
320+
ans[i] = s[i + n] - s[i + k + n];
321+
}
322+
}
323+
324+
return ans;
325+
}
326+
```
327+
311328
<!-- tabs:end -->
312329

313330
<!-- end -->

solution/1600-1699/1652.Defuse the Bomb/README_EN.md

Lines changed: 43 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -169,35 +169,26 @@ func decrypt(code []int, k int) []int {
169169

170170
```ts
171171
function decrypt(code: number[], k: number): number[] {
172-
const n = code.length;
172+
const n: number = code.length;
173+
const ans: number[] = Array(n).fill(0);
174+
173175
if (k === 0) {
174-
return code.fill(0);
175-
}
176-
const isPrefix = k < 0;
177-
if (isPrefix) {
178-
k *= -1;
179-
}
180-
const map = new Map<number, [number, number]>();
181-
let prefix = 0;
182-
let suffix = 0;
183-
for (let i = 1; i <= k; i++) {
184-
prefix += code[n - i];
185-
suffix += code[i];
186-
}
187-
map.set(0, [prefix, suffix]);
188-
189-
for (let i = 1; i < n; i++) {
190-
let [p, s] = map.get(i - 1);
191-
p -= code[n - k - 1 + i] ?? code[i - k - 1];
192-
p += code[i - 1];
193-
s -= code[i];
194-
s += code[i + k] ?? code[i + k - n];
195-
map.set(i, [p, s]);
176+
return ans;
196177
}
197-
for (let i = 0; i < n; i++) {
198-
code[i] = map.get(i)[Number(!isPrefix)];
178+
179+
for (let i = 0; i < n; ++i) {
180+
if (k > 0) {
181+
for (let j = i + 1; j < i + k + 1; ++j) {
182+
ans[i] += code[j % n];
183+
}
184+
} else {
185+
for (let j = i + k; j < i; ++j) {
186+
ans[i] += code[(j + n) % n];
187+
}
188+
}
199189
}
200-
return code;
190+
191+
return ans;
201192
}
202193
```
203194

@@ -304,6 +295,32 @@ func decrypt(code []int, k int) []int {
304295
}
305296
```
306297

298+
```ts
299+
function decrypt(code: number[], k: number): number[] {
300+
const n: number = code.length;
301+
const ans: number[] = Array(n).fill(0);
302+
303+
if (k === 0) {
304+
return ans;
305+
}
306+
307+
const s: number[] = Array((n << 1) | 1).fill(0);
308+
for (let i = 0; i < n << 1; ++i) {
309+
s[i + 1] = s[i] + code[i % n];
310+
}
311+
312+
for (let i = 0; i < n; ++i) {
313+
if (k > 0) {
314+
ans[i] = s[i + k + 1] - s[i + 1];
315+
} else {
316+
ans[i] = s[i + n] - s[i + k + n];
317+
}
318+
}
319+
320+
return ans;
321+
}
322+
```
323+
307324
<!-- tabs:end -->
308325

309326
<!-- end -->
Lines changed: 16 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,22 @@
11
function decrypt(code: number[], k: number): number[] {
2-
const n = code.length;
2+
const n: number = code.length;
3+
const ans: number[] = Array(n).fill(0);
4+
35
if (k === 0) {
4-
return code.fill(0);
5-
}
6-
const isPrefix = k < 0;
7-
if (isPrefix) {
8-
k *= -1;
9-
}
10-
const map = new Map<number, [number, number]>();
11-
let prefix = 0;
12-
let suffix = 0;
13-
for (let i = 1; i <= k; i++) {
14-
prefix += code[n - i];
15-
suffix += code[i];
6+
return ans;
167
}
17-
map.set(0, [prefix, suffix]);
188

19-
for (let i = 1; i < n; i++) {
20-
let [p, s] = map.get(i - 1);
21-
p -= code[n - k - 1 + i] ?? code[i - k - 1];
22-
p += code[i - 1];
23-
s -= code[i];
24-
s += code[i + k] ?? code[i + k - n];
25-
map.set(i, [p, s]);
9+
for (let i = 0; i < n; ++i) {
10+
if (k > 0) {
11+
for (let j = i + 1; j < i + k + 1; ++j) {
12+
ans[i] += code[j % n];
13+
}
14+
} else {
15+
for (let j = i + k; j < i; ++j) {
16+
ans[i] += code[(j + n) % n];
17+
}
18+
}
2619
}
27-
for (let i = 0; i < n; i++) {
28-
code[i] = map.get(i)[Number(!isPrefix)];
29-
}
30-
return code;
20+
21+
return ans;
3122
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
function decrypt(code: number[], k: number): number[] {
2+
const n: number = code.length;
3+
const ans: number[] = Array(n).fill(0);
4+
5+
if (k === 0) {
6+
return ans;
7+
}
8+
9+
const s: number[] = Array((n << 1) | 1).fill(0);
10+
for (let i = 0; i < n << 1; ++i) {
11+
s[i + 1] = s[i] + code[i % n];
12+
}
13+
14+
for (let i = 0; i < n; ++i) {
15+
if (k > 0) {
16+
ans[i] = s[i + k + 1] - s[i + 1];
17+
} else {
18+
ans[i] = s[i + n] - s[i + k + n];
19+
}
20+
}
21+
22+
return ans;
23+
}

0 commit comments

Comments
 (0)