leetcode算法题-移动零

题目

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]

说明:
1.必须在原数组上操作,不能拷贝额外的数组。
2.尽量减少操作次数。

作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/x2ba4i/
来源:力扣(LeetCode)

我的解法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Solution {
public void moveZeroes(int[] nums) {
if(nums.length == 1){
return;
}
int index = nums.length -1;
while(nums[index] == 0 && index > 0){
index--;
}
if(index == 0){
return;
}
boolean mark = false;
for (int i = 0; i <= index;i++ ) {
if(nums[i] == 0){
for (int j = i; j < index; j++) {
int temp = nums[j];
nums[j] = nums[j+1];
nums[j+1] = temp;
}
index--;
mark = true;
}
}
if(mark){
moveZeroes(nums);
}
}
}

思路就是记住最后不是0的位置,每次将0移动到后面。代码比较繁琐且不易理解。

官方解法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void moveZeroes(vector<int>& nums) {
int lastNonZeroFoundAt = 0;
// If the current element is not 0, then we need to
// append it just in front of last non 0 element we found.
for (int i = 0; i < nums.size(); i++) {
if (nums[i] != 0) {
nums[lastNonZeroFoundAt++] = nums[i];
}
}
// After we have finished processing new elements,
// all the non-zero elements are already at beginning of array.
// We just need to fill remaining array with 0's.
for (int i = lastNonZeroFoundAt; i < nums.size(); i++) {
nums[i] = 0;
}
}

以上为C++版本

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
public void moveZeroes(int[] nums) {
int index = 0;
for(int num:nums){
if(num!=0){
nums[index++]=num;
}
}
while(index<nums.length){
nums[index++] = 0;
}
}
}

解题思路:
遍历数组,无为0的元素移动数组前方,用index下标记录。
遍历结束,对index值后的元素统一设为0。

通俗易懂,看了一遍就理解了,相比之下我的解法真是太烂了。题解还是有非常多的解法值得学习!