Skip to content

Commit 857d25b

Browse files
committed
283
1 parent 782553a commit 857d25b

File tree

2 files changed

+73
-0
lines changed

2 files changed

+73
-0
lines changed

SUMMARY.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,4 +234,5 @@
234234
* [278. First Bad Version](leetcode-278-First-Bad-Version.md)
235235
* [279. Perfect Squares](leetcode-279-Perfect-Squares.md)
236236
* [282. Expression Add Operators](leetcode-282-Expression-Add-Operators.md)
237+
* [283. Move Zeroes](leetcode-283-Move-Zeroes.md)
237238
* [更多](more.md)

leetcode-283-Move-Zeroes.md

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
# 题目描述(简单难度)
2+
3+
![](https://windliang.oss-cn-beijing.aliyuncs.com/283.jpg)
4+
5+
将所有的 `0` 移动到末尾,并且保持其他数字的相对顺序不变。
6+
7+
# 解法一
8+
9+
我的第一反应是利用两个指针,一个指针指向开头,一个指针指向末尾非零元素,然后从开头指针遍历,如果遇到 `0` 就和末尾指向的元素相交换,末尾指针向前移动到非零元素。
10+
11+
这就保证末尾指针后边元素全部是 `0`,当首尾指针相遇的时候结束。
12+
13+
但是上边的想法会使得其他数字的相对顺序改变了,我们可以逆转一下思路。不是将 `0` 放到末尾,而是将所有非零元素放到开头,这样就保证末尾剩下的都是 `0` 了。
14+
15+
同样利用双指针,指针 `i` 用于遍历数组,指针 `j` 开始指向开头,保证它前边的所有元素都是非 `0` 元素。
16+
17+
`i` 指针遇到非零元素就和 `j` 指针指向的元素交换,`j` 指针然后后移。
18+
19+
`0,1,0,3,12` 为例模拟一下过程。
20+
21+
```java
22+
0,1,0,3,12
23+
^
24+
i
25+
j
26+
27+
nums[i] == 0, i 后移
28+
0,1,0,3,12
29+
^ ^
30+
j i
31+
32+
nums[i] != 0, 交换和 j 指向的元素, i 后移, j 后移
33+
1,0,0,3,12
34+
^ ^
35+
j i
36+
37+
nums[i] == 0, i 后移
38+
1,0,0,3,12
39+
^ ^
40+
j i
41+
42+
nums[i] != 0, 交换和 j 指向的元素, i 后移, j 后移
43+
1,3,0,0,12
44+
^ ^
45+
j i
46+
47+
nums[i] != 0, 交换和 j 指向的元素, i 后移, j 后移, 遍历结束
48+
1,3,12,0,0
49+
^ ^
50+
j i
51+
```
52+
53+
可以注意到 `j` 前边的元素始终都是非零元素,可以结合代码再看下。
54+
55+
```java
56+
public void moveZeroes(int[] nums) {
57+
int j = 0;
58+
for (int i = 0; i < nums.length; i++) {
59+
//不等于 0 就交换
60+
if (nums[i] != 0) {
61+
int temp = nums[j];
62+
nums[j] = nums[i];
63+
nums[i] = temp;
64+
j++;
65+
}
66+
}
67+
}
68+
```
69+
70+
#
71+
72+
比较简单的一道题,双指针经常用到。用一个指针用来分割元素,使得它前边都是符合某种条件的元素。在快速排序中,也有用到这个思想。

0 commit comments

Comments
 (0)