【LeetCode 30天挑战活动】Day4. Move Zeroes

(昨天肝大作业忘记写了,今天补上)

题目

给定一个整数数组,将其中的0都移到数组的末尾,其它数字保持原来的顺序
示例:
Input: [0,1,0,13,12]
Output: [1,13,12,0,0]
要求:in-place

我的思路

比较容易想到的就是双指针法,两个指针一个指向0,一个指向非0,从数组的第一个数开始,如果在一次循环中找到的0的位置在找到的非0位置之前,就交换两个数。
以题目示例来解释,指向0的指针为p1,指向非0的指针为p2。
首先p1指向0,p2指向1,由于p1在p2前,交换两数位置,继续向后寻找,p1指向0(index=1),p2指向13,发现p1在p2之前,交换两数位置……(以此类推)
代码如下:

class Solution {
    public void moveZeroes(int[] nums) {
        // two pointer
        if (nums == null || nums.length == 0) {
            return;
        }
        
        int pointToZero = 0, pointToNonZero = 0;
        int n = nums.length;
        
        while (pointToZero < n && pointToNonZero < n) {
            while (pointToZero < n && nums[pointToZero] != 0) {
                pointToZero++;
            }
            
            while (pointToNonZero < n && nums[pointToNonZero] == 0) {
                pointToNonZero++;
            }
            
            if (pointToZero < n && pointToNonZero < n && pointToZero < pointToNonZero) {
                // exchange
                nums[pointToZero] = nums[pointToNonZero];
                nums[pointToNonZero] = 0;
            }
            // pointToZero++;
            pointToNonZero++;
        }
    }
}

这个解法需要注意的地方有两点:

  1. 判断两数是否需要交换位置时一定要看指向0的指针是否在指向非0的指针之前,如果不满足这个条件,其实意味着0本来就在后面,不需要交换
  2. 在进入下一次循环之前需要移动指针的位置,但只需要移动指向非0的指针,指向0的指针需要保持原位,因为这个0可能也需要被交换到后面去
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值