Skip to content

Commit a56bc66

Browse files
committed
feat: add solutions to lc problem: No.0283
No.0283.Move Zeroes
1 parent b03dc68 commit a56bc66

File tree

7 files changed

+103
-171
lines changed

7 files changed

+103
-171
lines changed

solution/0200-0299/0283.Move Zeroes/README.md

+34-61
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,14 @@
4343

4444
<!-- 这里可写通用的实现逻辑 -->
4545

46+
**方法一:双指针**
47+
48+
我们使用两个指针 $i$ 和 $j$,其中指针 $i$ 指向当前已经处理好的序列的尾部,而指针 $j$ 指向待处理序列的头部。初始时 $i=-1$。
49+
50+
接下来,我们遍历 $j \in [0,n)$,如果 $nums[j] \neq 0$,那么我们就将指针 $i$ 指向的下一个数与 $nums[j]$ 交换,同时将 $i$ 后移。继续遍历,直至 $j$ 到达数组的尾部,该数组的所有非零元素就按照原有顺序被移动到数组的头部,而所有零元素都被移动到了数组的尾部。
51+
52+
时间复杂度 $O(n)$,其中 $n$ 是数组 $nums$ 的长度。空间复杂度 $O(1)$。
53+
4654
<!-- tabs:start -->
4755

4856
### **Python3**
@@ -52,14 +60,11 @@
5260
```python
5361
class Solution:
5462
def moveZeroes(self, nums: List[int]) -> None:
55-
"""
56-
Do not return anything, modify nums in-place instead.
57-
"""
58-
left, n = 0, len(nums)
59-
for right in range(n):
60-
if nums[right] != 0:
61-
nums[left], nums[right] = nums[right], nums[left]
62-
left += 1
63+
i = -1
64+
for j, x in enumerate(nums):
65+
if x:
66+
i += 1
67+
nums[i], nums[j] = nums[j], nums[i]
6368
```
6469

6570
### **Java**
@@ -69,13 +74,12 @@ class Solution:
6974
```java
7075
class Solution {
7176
public void moveZeroes(int[] nums) {
72-
int left = 0, n = nums.length;
73-
for (int right = 0; right < n; ++right) {
74-
if (nums[right] != 0) {
75-
int t = nums[left];
76-
nums[left] = nums[right];
77-
nums[right] = t;
78-
++left;
77+
int i = -1, n = nums.length;
78+
for (int j = 0; j < n; ++j) {
79+
if (nums[j] != 0) {
80+
int t = nums[++i];
81+
nums[i] = nums[j];
82+
nums[j] = t;
7983
}
8084
}
8185
}
@@ -88,11 +92,10 @@ class Solution {
8892
class Solution {
8993
public:
9094
void moveZeroes(vector<int>& nums) {
91-
int left = 0, n = nums.size();
92-
for (int right = 0; right < n; ++right) {
93-
if (nums[right] != 0) {
94-
swap(nums[left], nums[right]);
95-
++left;
95+
int i = -1, n = nums.size();
96+
for (int j = 0; j < n; ++j) {
97+
if (nums[j]) {
98+
swap(nums[++i], nums[j]);
9699
}
97100
}
98101
}
@@ -103,12 +106,11 @@ public:
103106
104107
```go
105108
func moveZeroes(nums []int) {
106-
n := len(nums)
107-
left := 0
108-
for right := 0; right < n; right++ {
109-
if nums[right] != 0 {
110-
nums[left], nums[right] = nums[right], nums[left]
111-
left++
109+
i := -1
110+
for j, x := range nums {
111+
if x != 0 {
112+
i++
113+
nums[i], nums[j] = nums[j], nums[i]
112114
}
113115
}
114116
}
@@ -122,41 +124,12 @@ func moveZeroes(nums []int) {
122124
* @return {void} Do not return anything, modify nums in-place instead.
123125
*/
124126
var moveZeroes = function (nums) {
125-
let left = 0,
126-
n = nums.length;
127-
for (let right = 0; right < n; ++right) {
128-
if (nums[right]) {
129-
[nums[left], nums[right]] = [nums[right], nums[left]];
130-
++left;
131-
}
132-
}
133-
};
134-
```
135-
136-
```js
137-
/**
138-
* @param {number[]} nums
139-
* @return {void} Do not return anything, modify nums in-place instead.
140-
*/
141-
var moveZeroes = function (nums) {
142-
let left = 0;
143-
let right = left;
144-
while (left < nums.length) {
145-
if (nums[left] != 0) {
146-
left++;
147-
} else {
148-
right = left + 1;
149-
while (right < nums.length) {
150-
if (nums[right] == 0) {
151-
right++;
152-
} else {
153-
let tem = nums[left];
154-
nums[left] = nums[right];
155-
nums[right] = tem;
156-
break;
157-
}
158-
}
159-
left++;
127+
let i = -1;
128+
for (let j = 0; j < nums.length; ++j) {
129+
if (nums[j]) {
130+
const t = nums[++i];
131+
nums[i] = nums[j];
132+
nums[j] = t;
160133
}
161134
}
162135
};

solution/0200-0299/0283.Move Zeroes/README_EN.md

+26-61
Original file line numberDiff line numberDiff line change
@@ -36,28 +36,24 @@
3636
```python
3737
class Solution:
3838
def moveZeroes(self, nums: List[int]) -> None:
39-
"""
40-
Do not return anything, modify nums in-place instead.
41-
"""
42-
left, n = 0, len(nums)
43-
for right in range(n):
44-
if nums[right] != 0:
45-
nums[left], nums[right] = nums[right], nums[left]
46-
left += 1
39+
i = -1
40+
for j, x in enumerate(nums):
41+
if x:
42+
i += 1
43+
nums[i], nums[j] = nums[j], nums[i]
4744
```
4845

4946
### **Java**
5047

5148
```java
5249
class Solution {
5350
public void moveZeroes(int[] nums) {
54-
int left = 0, n = nums.length;
55-
for (int right = 0; right < n; ++right) {
56-
if (nums[right] != 0) {
57-
int t = nums[left];
58-
nums[left] = nums[right];
59-
nums[right] = t;
60-
++left;
51+
int i = -1, n = nums.length;
52+
for (int j = 0; j < n; ++j) {
53+
if (nums[j] != 0) {
54+
int t = nums[++i];
55+
nums[i] = nums[j];
56+
nums[j] = t;
6157
}
6258
}
6359
}
@@ -70,11 +66,10 @@ class Solution {
7066
class Solution {
7167
public:
7268
void moveZeroes(vector<int>& nums) {
73-
int left = 0, n = nums.size();
74-
for (int right = 0; right < n; ++right) {
75-
if (nums[right] != 0) {
76-
swap(nums[left], nums[right]);
77-
++left;
69+
int i = -1, n = nums.size();
70+
for (int j = 0; j < n; ++j) {
71+
if (nums[j]) {
72+
swap(nums[++i], nums[j]);
7873
}
7974
}
8075
}
@@ -85,12 +80,11 @@ public:
8580
8681
```go
8782
func moveZeroes(nums []int) {
88-
n := len(nums)
89-
left := 0
90-
for right := 0; right < n; right++ {
91-
if nums[right] != 0 {
92-
nums[left], nums[right] = nums[right], nums[left]
93-
left++
83+
i := -1
84+
for j, x := range nums {
85+
if x != 0 {
86+
i++
87+
nums[i], nums[j] = nums[j], nums[i]
9488
}
9589
}
9690
}
@@ -104,41 +98,12 @@ func moveZeroes(nums []int) {
10498
* @return {void} Do not return anything, modify nums in-place instead.
10599
*/
106100
var moveZeroes = function (nums) {
107-
let left = 0,
108-
n = nums.length;
109-
for (let right = 0; right < n; ++right) {
110-
if (nums[right]) {
111-
[nums[left], nums[right]] = [nums[right], nums[left]];
112-
++left;
113-
}
114-
}
115-
};
116-
```
117-
118-
```js
119-
/**
120-
* @param {number[]} nums
121-
* @return {void} Do not return anything, modify nums in-place instead.
122-
*/
123-
var moveZeroes = function (nums) {
124-
let left = 0;
125-
let right = left;
126-
while (left < nums.length) {
127-
if (nums[left] != 0) {
128-
left++;
129-
} else {
130-
right = left + 1;
131-
while (right < nums.length) {
132-
if (nums[right] == 0) {
133-
right++;
134-
} else {
135-
let tem = nums[left];
136-
nums[left] = nums[right];
137-
nums[right] = tem;
138-
break;
139-
}
140-
}
141-
left++;
101+
let i = -1;
102+
for (let j = 0; j < nums.length; ++j) {
103+
if (nums[j]) {
104+
const t = nums[++i];
105+
nums[i] = nums[j];
106+
nums[j] = t;
142107
}
143108
}
144109
};
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
1-
class Solution {
2-
public:
3-
void moveZeroes(vector<int>& nums) {
4-
int left = 0, n = nums.size();
5-
for (int right = 0; right < n; ++right) {
6-
if (nums[right] != 0) {
7-
swap(nums[left], nums[right]);
8-
++left;
9-
}
10-
}
11-
}
1+
class Solution {
2+
public:
3+
void moveZeroes(vector<int>& nums) {
4+
int i = -1, n = nums.size();
5+
for (int j = 0; j < n; ++j) {
6+
if (nums[j]) {
7+
swap(nums[++i], nums[j]);
8+
}
9+
}
10+
}
1211
};
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
1-
func moveZeroes(nums []int) {
2-
n := len(nums)
3-
left := 0
4-
for right := 0; right < n; right++ {
5-
if nums[right] != 0 {
6-
nums[left], nums[right] = nums[right], nums[left]
7-
left++
8-
}
9-
}
10-
}
1+
func moveZeroes(nums []int) {
2+
i := -1
3+
for j, x := range nums {
4+
if x != 0 {
5+
i++
6+
nums[i], nums[j] = nums[j], nums[i]
7+
}
8+
}
9+
}
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
1-
class Solution {
2-
public void moveZeroes(int[] nums) {
3-
int left = 0, n = nums.length;
4-
for (int right = 0; right < n; ++right) {
5-
if (nums[right] != 0) {
6-
int t = nums[left];
7-
nums[left] = nums[right];
8-
nums[right] = t;
9-
++left;
10-
}
11-
}
12-
}
1+
class Solution {
2+
public void moveZeroes(int[] nums) {
3+
int i = -1, n = nums.length;
4+
for (int j = 0; j < n; ++j) {
5+
if (nums[j] != 0) {
6+
int t = nums[++i];
7+
nums[i] = nums[j];
8+
nums[j] = t;
9+
}
10+
}
11+
}
1312
}

solution/0200-0299/0283.Move Zeroes/Solution.js

+6-6
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@
33
* @return {void} Do not return anything, modify nums in-place instead.
44
*/
55
var moveZeroes = function (nums) {
6-
let left = 0,
7-
n = nums.length;
8-
for (let right = 0; right < n; ++right) {
9-
if (nums[right]) {
10-
[nums[left], nums[right]] = [nums[right], nums[left]];
11-
++left;
6+
let i = -1;
7+
for (let j = 0; j < nums.length; ++j) {
8+
if (nums[j]) {
9+
const t = nums[++i];
10+
nums[i] = nums[j];
11+
nums[j] = t;
1212
}
1313
}
1414
};
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
1-
class Solution:
2-
def moveZeroes(self, nums: List[int]) -> None:
3-
"""
4-
Do not return anything, modify nums in-place instead.
5-
"""
6-
left, n = 0, len(nums)
7-
for right in range(n):
8-
if nums[right] != 0:
9-
nums[left], nums[right] = nums[right], nums[left]
10-
left += 1
1+
class Solution:
2+
def moveZeroes(self, nums: List[int]) -> None:
3+
i = -1
4+
for j, x in enumerate(nums):
5+
if x:
6+
i += 1
7+
nums[i], nums[j] = nums[j], nums[i]

0 commit comments

Comments
 (0)