Skip to content
本页目录

0283-移动零

https://leetcode.cn/problems/move-zeroes

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意,必须在不复制数组的情况下原地对数组进行操作。

示例 1:

输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]

示例 2:

输入: nums = [0]
输出: [0]

提示:

1 <= nums.length <= 10^4
-2^31<= nums[i] <= 2^31- 1

进阶:你能尽量减少完成的操作次数吗?

思路

题目要求0移动到末尾,且相对顺序要保持 双指针从前往后遍历,非0直接跳过,遇到0,则复制下一个元素过来,并且将该元素位置设置为0

参考代码

csharp
public class Solution {
    public void MoveZeroes(int[] nums) {
        int i = 0;
        while(i<nums.Length && nums[i] != 0 ){
            i++;
        }
        for(int j = i+1; j < nums.Length; j++){
            if(nums[j] != 0){
                nums[i] = nums[j];
                nums[j] = 0;
                i++;
            }
        }
    }
}

参考代码:优化前置0的判断

csharp
public class Solution {
    public void MoveZeroes(int[] nums) {
        int left = 0;
        for(int i=0; i<nums.Length; i++){
            if(nums[i] != 0){
                nums[left] = nums[i];
                if(i != left){
                    nums[i] = 0;
                }
                left++;
            }
        }
    }
}

Released under the MIT License.