【双指针】力扣283. MoveZeroes-移动零

🔗链接

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

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

示例 2:
输入: nums = [0]
输出: [0]

提示:
1 <= nums.length <= 104
-231 <= nums[i] <= 231 - 1
进阶:你能尽量减少完成的操作次数吗?

解题思路

运用快慢指针的思路。num_p作为快指针,指向是未经处理过的第一个非零数字;zero_p作为慢指针,指向的是未经处理过的第一个零的位置并且不大于num_p指针;
当慢指针指向0并且快指针指向数字的时候进行调换,这时候可以保证非零数字顺序不会发生改变。
针对指针细节处理,快指针在比慢指针位置相同或小的时候快指针要向前移动。

代码

class Solution {
    public static void moveZeroes(int[] nums) {
        int zero_p = 0, num_p = 0;
        while(num_p < nums.length && zero_p<nums.length) {
            if(nums[zero_p] == 0 && nums[num_p] != 0) {
                int temp = nums[num_p];
                nums[num_p] = nums[zero_p];
                nums[zero_p] = temp;
            }
            if(nums[zero_p] != 0 && num_p > zero_p) zero_p++;
            if(nums[num_p] == 0 || num_p <= zero_p) num_p++;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值