61
61
62
62
<!-- 这里可写通用的实现逻辑 -->
63
63
64
- 数组下标取模,累加求每一项即可。
64
+ ** 方法一:模拟**
65
+
66
+ 定义答案数组 ` ans ` ,长度为 $n$,初始时所有元素都为 $0$。根据题意,若 $k$ 为 $0$,直接返回 ` ans ` 。
67
+
68
+ 否则,遍历每个位置 $i$:
69
+
70
+ 若 $k$ 为正数,那么 $i$ 位置的值为 $i$ 位置后 $k$ 个位置的值之和,即:
71
+
72
+ $$
73
+ ans[i] = \sum_{j=i+1}^{i+k} code[j\mod{n}]
74
+ $$
75
+
76
+ 若 $k$ 为负数,那么 $i$ 位置的值为 $i$ 位置前 $|k|$ 个位置的值之和,即:
77
+
78
+ $$
79
+ ans[i] = \sum_{j=i+k}^{i-1} code[(j+n)\mod{n}]
80
+ $$
81
+
82
+ 时间复杂度 $O(n\times|k|)$,忽略答案的空间消耗,空间复杂度 $O(1)$。
83
+
84
+ ** 方法二:前缀和**
85
+
86
+ 在方法一中,对于每个位置 $i$,都需要遍历 $k$ 个位置,有很多重复计算的操作。我们可以利用前缀和来优化。
87
+
88
+ 我们将 ` code ` 数组复制一份(可以不用执行复制操作,直接通过循环遍历取模实现),得到两倍长度的数组,对其求前缀和,得到长度为 $2\times n + 1$ 的前缀和数组 $s$。
89
+
90
+ 若 $k$ 为正数,那么 $i$ 位置的值为 $i$ 位置后 $k$ 个位置的值之和,即 $ans[ i] = s[ i + k + 1] - s[ i + 1] $。
91
+
92
+ 若 $k$ 为负数,那么 $i$ 位置的值为 $i$ 位置前 $|k|$ 个位置的值之和,即 $ans[ i] = s[ i + n] - s[ i + k + n] $。
93
+
94
+ 时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为 ` code ` 数组的长度。
65
95
66
96
<!-- tabs:start -->
67
97
73
103
class Solution :
74
104
def decrypt (self , code : List[int ], k : int ) -> List[int ]:
75
105
n = len (code)
76
- res = [0 ] * n
106
+ ans = [0 ] * n
77
107
if k == 0 :
78
- return res
108
+ return ans
79
109
for i in range (n):
80
110
if k > 0 :
81
111
for j in range (i + 1 , i + k + 1 ):
82
- res [i] += code[j % n]
112
+ ans [i] += code[j % n]
83
113
else :
84
114
for j in range (i + k, i):
85
- res[i] += code[(j + n) % n]
86
- return res
115
+ ans[i] += code[(j + n) % n]
116
+ return ans
117
+ ```
118
+
119
+ ``` python
120
+ class Solution :
121
+ def decrypt (self , code : List[int ], k : int ) -> List[int ]:
122
+ n = len (code)
123
+ ans = [0 ] * n
124
+ if k == 0 :
125
+ return ans
126
+ s = list (accumulate(code + code, initial = 0 ))
127
+ for i in range (n):
128
+ if k > 0 :
129
+ ans[i] = s[i + k + 1 ] - s[i + 1 ]
130
+ else :
131
+ ans[i] = s[i + n] - s[i + k + n]
132
+ return ans
87
133
```
88
134
89
135
### ** Java**
@@ -94,24 +140,148 @@ class Solution:
94
140
class Solution {
95
141
public int [] decrypt (int [] code , int k ) {
96
142
int n = code. length;
97
- int [] res = new int [n];
98
- if (k == 0 ) return res;
143
+ int [] ans = new int [n];
144
+ if (k == 0 ) {
145
+ return ans;
146
+ }
99
147
for (int i = 0 ; i < n; ++ i) {
100
148
if (k > 0 ) {
101
- for (int j = i + 1 ; j <= i + k; ++ j) {
102
- res [i] += code[j % n];
149
+ for (int j = i + 1 ; j < i + k + 1 ; ++ j) {
150
+ ans [i] += code[j % n];
103
151
}
104
152
} else {
105
- for (int j = i + k; j <= i - 1 ; ++ j) {
106
- res [i] += code[(j + n) % n];
153
+ for (int j = i + k; j < i ; ++ j) {
154
+ ans [i] += code[(j + n) % n];
107
155
}
108
156
}
109
157
}
110
- return res ;
158
+ return ans ;
111
159
}
112
160
}
113
161
```
114
162
163
+ ``` java
164
+ class Solution {
165
+ public int [] decrypt (int [] code , int k ) {
166
+ int n = code. length;
167
+ int [] ans = new int [n];
168
+ if (k == 0 ) {
169
+ return ans;
170
+ }
171
+ int [] s = new int [n << 1 | 1 ];
172
+ for (int i = 0 ; i < n << 1 ; ++ i) {
173
+ s[i + 1 ] = s[i] + code[i % n];
174
+ }
175
+ for (int i = 0 ; i < n; ++ i) {
176
+ if (k > 0 ) {
177
+ ans[i] = s[i + k + 1 ] - s[i + 1 ];
178
+ } else {
179
+ ans[i] = s[i + n] - s[i + k + n];
180
+ }
181
+ }
182
+ return ans;
183
+ }
184
+ }
185
+ ```
186
+
187
+ ### ** C++**
188
+
189
+ ``` cpp
190
+ class Solution {
191
+ public:
192
+ vector<int > decrypt(vector<int >& code, int k) {
193
+ int n = code.size();
194
+ vector<int > ans(n);
195
+ if (k == 0) {
196
+ return ans;
197
+ }
198
+ for (int i = 0; i < n; ++i) {
199
+ if (k > 0) {
200
+ for (int j = i + 1; j < i + k + 1; ++j) {
201
+ ans[ i] += code[ j % n] ;
202
+ }
203
+ } else {
204
+ for (int j = i + k; j < i; ++j) {
205
+ ans[ i] += code[ (j + n) % n] ;
206
+ }
207
+ }
208
+ }
209
+ return ans;
210
+ }
211
+ };
212
+ ```
213
+
214
+ ```cpp
215
+ class Solution {
216
+ public:
217
+ vector<int> decrypt(vector<int>& code, int k) {
218
+ int n = code.size();
219
+ vector<int> ans(n);
220
+ if (k == 0) {
221
+ return ans;
222
+ }
223
+ vector<int> s(n << 1 | 1);
224
+ for (int i = 0; i < n << 1; ++i) {
225
+ s[i + 1] = s[i] + code[i % n];
226
+ }
227
+ for (int i = 0; i < n; ++i) {
228
+ if (k > 0) {
229
+ ans[i] = s[i + k + 1] - s[i + 1];
230
+ } else {
231
+ ans[i] = s[i + n] - s[i + k + n];
232
+ }
233
+ }
234
+ return ans;
235
+ }
236
+ };
237
+ ```
238
+
239
+ ### ** Go**
240
+
241
+ ``` go
242
+ func decrypt (code []int , k int ) []int {
243
+ n := len (code)
244
+ ans := make ([]int , n)
245
+ if k == 0 {
246
+ return ans
247
+ }
248
+ for i := 0 ; i < n; i++ {
249
+ if k > 0 {
250
+ for j := i + 1 ; j < i+k+1 ; j++ {
251
+ ans[i] += code[j%n]
252
+ }
253
+ } else {
254
+ for j := i + k; j < i; j++ {
255
+ ans[i] += code[(j+n)%n]
256
+ }
257
+ }
258
+ }
259
+ return ans
260
+ }
261
+ ```
262
+
263
+ ``` go
264
+ func decrypt (code []int , k int ) []int {
265
+ n := len (code)
266
+ ans := make ([]int , n)
267
+ if k == 0 {
268
+ return ans
269
+ }
270
+ s := make ([]int , n<<1 |1 )
271
+ for i := 0 ; i < n<<1 ; i++ {
272
+ s[i+1 ] = s[i] + code[i%n]
273
+ }
274
+ for i := range code {
275
+ if k > 0 {
276
+ ans[i] = s[i+k+1 ] - s[i+1 ]
277
+ } else {
278
+ ans[i] = s[i+n] - s[i+k+n]
279
+ }
280
+ }
281
+ return ans
282
+ }
283
+ ```
284
+
115
285
### ** ...**
116
286
117
287
```
0 commit comments