Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 173bc81

Browse files
feat: add solutions to lc problems: No.0541,0542 (doocs#3317)
1 parent 04a84f3 commit 173bc81

File tree

11 files changed

+198
-161
lines changed

11 files changed

+198
-161
lines changed

‎solution/0500-0599/0541.Reverse String II/README.md‎

Lines changed: 40 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,11 @@ tags:
5656

5757
<!-- solution:start -->
5858

59-
### 方法一
59+
### 方法一:双指针
60+
61+
我们可以遍历字符串 $\textit{s},ドル每次遍历 $\textit{2k}$ 个字符,然后利用双指针技巧,对这 $\textit{2k}$ 个字符中的前 $\textit{k}$ 个字符进行反转。
62+
63+
时间复杂度 $O(n),ドル空间复杂度 $O(n)$。其中 $n$ 为字符串 $\textit{s}$ 的长度。
6064

6165
<!-- tabs:start -->
6266

@@ -65,26 +69,27 @@ tags:
6569
```python
6670
class Solution:
6771
def reverseStr(self, s: str, k: int) -> str:
68-
t = list(s)
69-
for i in range(0, len(t), k <<1):
70-
t[i : i + k] = reversed(t[i : i + k])
71-
return ''.join(t)
72+
cs = list(s)
73+
for i in range(0, len(cs), 2* k):
74+
cs[i : i + k] = reversed(cs[i : i + k])
75+
return "".join(cs)
7276
```
7377

7478
#### Java
7579

7680
```java
7781
class Solution {
7882
public String reverseStr(String s, int k) {
79-
char[] chars = s.toCharArray();
80-
for (int i = 0; i < chars.length; i += (k << 1)) {
81-
for (int st = i, ed = Math.min(chars.length - 1, i + k - 1); st < ed; ++st, --ed) {
82-
char t = chars[st];
83-
chars[st] = chars[ed];
84-
chars[ed] = t;
83+
char[] cs = s.toCharArray();
84+
int n = cs.length;
85+
for (int i = 0; i < n; i += k * 2) {
86+
for (int l = i, r = Math.min(i + k - 1, n - 1); l < r; ++l, --r) {
87+
char t = cs[l];
88+
cs[l] = cs[r];
89+
cs[r] = t;
8590
}
8691
}
87-
return new String(chars);
92+
return new String(cs);
8893
}
8994
}
9095
```
@@ -95,7 +100,8 @@ class Solution {
95100
class Solution {
96101
public:
97102
string reverseStr(string s, int k) {
98-
for (int i = 0, n = s.size(); i < n; i += (k << 1)) {
103+
int n = s.size();
104+
for (int i = 0; i < n; i += 2 * k) {
99105
reverse(s.begin() + i, s.begin() + min(i + k, n));
100106
}
101107
return s;
@@ -107,13 +113,29 @@ public:
107113
108114
```go
109115
func reverseStr(s string, k int) string {
110-
t := []byte(s)
111-
for i := 0; i < len(t); i += (k << 1) {
112-
for st, ed := i, min(i+k-1, len(t)-1); st < ed; st, ed = st+1, ed-1 {
113-
t[st], t[ed] = t[ed], t[st]
116+
cs := []byte(s)
117+
n := len(cs)
118+
for i := 0; i < n; i += 2 * k {
119+
for l, r := i, min(i+k-1, n-1); l < r; l, r = l+1, r-1 {
120+
cs[l], cs[r] = cs[r], cs[l]
114121
}
115122
}
116-
return string(t)
123+
return string(cs)
124+
}
125+
```
126+
127+
#### TypeScript
128+
129+
```ts
130+
function reverseStr(s: string, k: number): string {
131+
const n = s.length;
132+
const cs = s.split('');
133+
for (let i = 0; i < n; i += 2 * k) {
134+
for (let l = i, r = Math.min(i + k - 1, n - 1); l < r; l++, r--) {
135+
[cs[l], cs[r]] = [cs[r], cs[l]];
136+
}
137+
}
138+
return cs.join('');
117139
}
118140
```
119141

‎solution/0500-0599/0541.Reverse String II/README_EN.md‎

Lines changed: 40 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,11 @@ tags:
4444

4545
<!-- solution:start -->
4646

47-
### Solution 1
47+
### Solution 1: Two Pointers
48+
49+
We can traverse the string $\textit{s},ドル iterating over every $\textit{2k}$ characters, and then use the two-pointer technique to reverse the first $\textit{k}$ characters among these $\textit{2k}$ characters.
50+
51+
The time complexity is $O(n),ドル and the space complexity is $O(n)$. Here, $n$ is the length of the string $\textit{s}$.
4852

4953
<!-- tabs:start -->
5054

@@ -53,26 +57,27 @@ tags:
5357
```python
5458
class Solution:
5559
def reverseStr(self, s: str, k: int) -> str:
56-
t = list(s)
57-
for i in range(0, len(t), k <<1):
58-
t[i : i + k] = reversed(t[i : i + k])
59-
return ''.join(t)
60+
cs = list(s)
61+
for i in range(0, len(cs), 2* k):
62+
cs[i : i + k] = reversed(cs[i : i + k])
63+
return "".join(cs)
6064
```
6165

6266
#### Java
6367

6468
```java
6569
class Solution {
6670
public String reverseStr(String s, int k) {
67-
char[] chars = s.toCharArray();
68-
for (int i = 0; i < chars.length; i += (k << 1)) {
69-
for (int st = i, ed = Math.min(chars.length - 1, i + k - 1); st < ed; ++st, --ed) {
70-
char t = chars[st];
71-
chars[st] = chars[ed];
72-
chars[ed] = t;
71+
char[] cs = s.toCharArray();
72+
int n = cs.length;
73+
for (int i = 0; i < n; i += k * 2) {
74+
for (int l = i, r = Math.min(i + k - 1, n - 1); l < r; ++l, --r) {
75+
char t = cs[l];
76+
cs[l] = cs[r];
77+
cs[r] = t;
7378
}
7479
}
75-
return new String(chars);
80+
return new String(cs);
7681
}
7782
}
7883
```
@@ -83,7 +88,8 @@ class Solution {
8388
class Solution {
8489
public:
8590
string reverseStr(string s, int k) {
86-
for (int i = 0, n = s.size(); i < n; i += (k << 1)) {
91+
int n = s.size();
92+
for (int i = 0; i < n; i += 2 * k) {
8793
reverse(s.begin() + i, s.begin() + min(i + k, n));
8894
}
8995
return s;
@@ -95,13 +101,29 @@ public:
95101
96102
```go
97103
func reverseStr(s string, k int) string {
98-
t := []byte(s)
99-
for i := 0; i < len(t); i += (k << 1) {
100-
for st, ed := i, min(i+k-1, len(t)-1); st < ed; st, ed = st+1, ed-1 {
101-
t[st], t[ed] = t[ed], t[st]
104+
cs := []byte(s)
105+
n := len(cs)
106+
for i := 0; i < n; i += 2 * k {
107+
for l, r := i, min(i+k-1, n-1); l < r; l, r = l+1, r-1 {
108+
cs[l], cs[r] = cs[r], cs[l]
102109
}
103110
}
104-
return string(t)
111+
return string(cs)
112+
}
113+
```
114+
115+
#### TypeScript
116+
117+
```ts
118+
function reverseStr(s: string, k: number): string {
119+
const n = s.length;
120+
const cs = s.split('');
121+
for (let i = 0; i < n; i += 2 * k) {
122+
for (let l = i, r = Math.min(i + k - 1, n - 1); l < r; l++, r--) {
123+
[cs[l], cs[r]] = [cs[r], cs[l]];
124+
}
125+
}
126+
return cs.join('');
105127
}
106128
```
107129

‎solution/0500-0599/0541.Reverse String II/Solution.cpp‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
class Solution {
22
public:
33
string reverseStr(string s, int k) {
4-
for (int i = 0, n = s.size(); i < n; i += (k << 1)) {
4+
int n = s.size();
5+
for (int i = 0; i < n; i += 2 * k) {
56
reverse(s.begin() + i, s.begin() + min(i + k, n));
67
}
78
return s;
Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
func reverseStr(s string, k int) string {
2-
t := []byte(s)
3-
for i := 0; i < len(t); i += (k << 1) {
4-
for st, ed := i, min(i+k-1, len(t)-1); st < ed; st, ed = st+1, ed-1 {
5-
t[st], t[ed] = t[ed], t[st]
2+
cs := []byte(s)
3+
n := len(cs)
4+
for i := 0; i < n; i += 2 * k {
5+
for l, r := i, min(i+k-1, n-1); l < r; l, r = l+1, r-1 {
6+
cs[l], cs[r] = cs[r], cs[l]
67
}
78
}
8-
return string(t)
9+
return string(cs)
910
}
Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
class Solution {
22
public String reverseStr(String s, int k) {
3-
char[] chars = s.toCharArray();
4-
for (int i = 0; i < chars.length; i += (k << 1)) {
5-
for (int st = i, ed = Math.min(chars.length - 1, i + k - 1); st < ed; ++st, --ed) {
6-
char t = chars[st];
7-
chars[st] = chars[ed];
8-
chars[ed] = t;
3+
char[] cs = s.toCharArray();
4+
int n = cs.length;
5+
for (int i = 0; i < n; i += k * 2) {
6+
for (int l = i, r = Math.min(i + k - 1, n - 1); l < r; ++l, --r) {
7+
char t = cs[l];
8+
cs[l] = cs[r];
9+
cs[r] = t;
910
}
1011
}
11-
return new String(chars);
12+
return new String(cs);
1213
}
1314
}
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
class Solution:
22
def reverseStr(self, s: str, k: int) -> str:
3-
t = list(s)
4-
for i in range(0, len(t), k<<1):
5-
t[i : i + k] = reversed(t[i : i + k])
6-
return ''.join(t)
3+
cs = list(s)
4+
for i in range(0, len(cs), 2*k):
5+
cs[i : i + k] = reversed(cs[i : i + k])
6+
return "".join(cs)
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
function reverseStr(s: string, k: number): string {
2+
const n = s.length;
3+
const cs = s.split('');
4+
for (let i = 0; i < n; i += 2 * k) {
5+
for (let l = i, r = Math.min(i + k - 1, n - 1); l < r; l++, r--) {
6+
[cs[l], cs[r]] = [cs[r], cs[l]];
7+
}
8+
}
9+
return cs.join('');
10+
}

‎solution/0500-0599/0542.01 Matrix/README.md‎

Lines changed: 32 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -62,11 +62,17 @@ tags:
6262

6363
<!-- solution:start -->
6464

65-
### 方法一:多源 BFS
65+
### 方法一:BFS
6666

67-
初始化结果矩阵 ans,所有 0 的距离为 0,所以 1 的距离为 -1。初始化队列 q 存储 BFS 需要检查的位置,并将所有 0 的位置入队
67+
我们创建一个大小和 $\textit{mat}$ 一样的矩阵 $\textit{ans},ドル并将所有的元素初始化为 $-1$
6868

69-
循环弹出队列 q 的元素 `p(i, j)`,检查邻居四个点。对于邻居 `(x, y)`,如果 `ans[x][y] = -1`,则更新 `ans[x][y] = ans[i][j] + 1`。同时将 `(x, y)` 入队。
69+
然后我们遍历 $\textit{mat},ドル将所有的 0ドル$ 元素的坐标 $(i, j)$ 加入队列 $\textit{q},ドル并将 $\textit{ans}[i][j]$ 设为 0ドル$。
70+
71+
接下来,我们使用广度优先搜索,从队列中取出一个元素 $(i, j),ドル并遍历其四个方向,如果该方向的元素 $(x, y)$ 满足 0ドル \leq x < m,ドル 0ドル \leq y < n$ 且 $\textit{ans}[x][y] = -1,ドル则将 $\textit{ans}[x][y]$ 设为 $\textit{ans}[i][j] + 1,ドル并将 $(x, y)$ 加入队列 $\textit{q}$。
72+
73+
最后返回 $\textit{ans}$。
74+
75+
时间复杂度 $O(m \times n),ドル空间复杂度 $O(m \times n)$。其中 $m$ 和 $n$ 分别为矩阵 $\textit{mat}$ 的行数和列数。
7076

7177
<!-- tabs:start -->
7278

@@ -219,8 +225,7 @@ function updateMatrix(mat: number[][]): number[][] {
219225
}
220226
}
221227
const dirs: number[] = [-1, 0, 1, 0, -1];
222-
while (q.length) {
223-
const [i, j] = q.shift()!;
228+
for (const [i, j] of q) {
224229
for (let k = 0; k < 4; ++k) {
225230
const [x, y] = [i + dirs[k], j + dirs[k + 1]];
226231
if (x >= 0 && x < m && y >= 0 && y < n && ans[x][y] === -1) {
@@ -239,49 +244,38 @@ function updateMatrix(mat: number[][]): number[][] {
239244
use std::collections::VecDeque;
240245

241246
impl Solution {
242-
#[allow(dead_code)]
243247
pub fn update_matrix(mat: Vec<Vec<i32>>) -> Vec<Vec<i32>> {
244-
let n: usize = mat.len();
245-
let m: usize = mat[0].len();
246-
let mut ret_vec: Vec<Vec<i32>> = vec![vec![-1; m]; n];
247-
// The inner tuple is of <X, Y, Current Count>
248-
let mut the_q: VecDeque<(usize, usize)> = VecDeque::new();
249-
let traverse_vec: Vec<(i32, i32)> = vec![(-1, 0), (1, 0), (0, 1), (0, -1)];
250-
251-
// Initialize the queue
252-
for i in 0..n {
253-
for j in 0..m {
248+
let m = mat.len();
249+
let n = mat[0].len();
250+
let mut ans = vec![vec![-1; n]; m];
251+
let mut q = VecDeque::new();
252+
253+
for i in 0..m {
254+
for j in 0..n {
254255
if mat[i][j] == 0 {
255-
// For the zero cell, enqueue at first
256-
the_q.push_back((i, j));
257-
// Set to 0 in return vector
258-
ret_vec[i][j] = 0;
256+
q.push_back((i, j));
257+
ans[i][j] = 0;
259258
}
260259
}
261260
}
262261

263-
while!the_q.is_empty() {
264-
let (x, y) = the_q.front().unwrap().clone();
265-
the_q.pop_front();
266-
forpairin&traverse_vec {
267-
let cur_x = pair.0+ (xasi32);
268-
letcur_y=pair.1+ (yas i32);
269-
ifSolution::check_bounds(cur_x, cur_y, nasi32, mas i32)
270-
&&ret_vec[cur_xasusize][cur_y as usize] ==-1
271-
{
272-
// The current cell has not be updated yet, and is also in bound
273-
ret_vec[cur_xasusize][cur_yasusize] =ret_vec[x][y] +1;
274-
the_q.push_back((cur_xasusize, cur_yasusize));
262+
letdirs= [-1, 0, 1, 0, -1];
263+
whilelet Some((i, j)) = q.pop_front() {
264+
forkin0..4 {
265+
letx=iasisize+dirs[k];
266+
let y = jasisize+dirs[k+1];
267+
ifx>=0&&x<masisize&&y>=0&&y<nas isize {
268+
letx=xas usize;
269+
lety=y as usize;
270+
ifans[x][y] ==-1{
271+
ans[x][y] =ans[i][j] +1;
272+
q.push_back((x, y));
273+
}
275274
}
276275
}
277276
}
278277

279-
ret_vec
280-
}
281-
282-
#[allow(dead_code)]
283-
pub fn check_bounds(i: i32, j: i32, n: i32, m: i32) -> bool {
284-
i >= 0 && i < n && j >= 0 && j < m
278+
ans
285279
}
286280
}
287281
```

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /