算法刷题:移动零

.

在这里插入图片描述

题目链接

移动零

详解

题目要求我们要把数组中所有的零都移动到数组的末尾,且要求其余数字顺序不改变.这道题,我们使用到的是双指针算法:
利用两个指针,将数组分为三个部分,
在这里插入图片描述
三个区间分别为

  1. [0,desc]
  2. [desc+1,cur-1]
  3. [cur,n-1]
    在0到cur-1之间,表示已经校验的部分

cur

因为cur指针是用来遍历整个数组的,那么它的初始值应该为0,且以n-1为末值.

desc

因为desc表示的是非零元素的最后一个数,那么它在一开始是没有非零的数字的,所以这里给它赋值为-1,

算法原理

当nums[cur]==0时,只需要使得cur++,因为这样正好可以使得cur的左边是已校验的零区域
当nums[cur]!=0时,为了满足上面的三个区域,应该将当前非零值放在非零值区域的最后一个,也就是desc+1处,而且desc+1处的数字正好也是零区域的第一个,所以,将nums[cur]与nums[desc+1]进行交换,然后将cur与desc进行+1操作,这样就又使得数组满足了上面的三个区域的条件

答案

class Solution {
    public void moveZeroes(int[] nums) {
        int cur = 0;
        int desc = -1;
        while(cur<nums.length){
            if(nums[cur]!=0){
                swap(nums,desc+1,cur);
                desc++;
            }
            cur++;
        }
    }
    public void swap(int[]nums,int a ,int b){
        int tmp = nums[a];
        nums[a]=nums[b];
        nums[b]=tmp;
    }
}
  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值