LeetCode0283-移动零

双指针

比较具有利用指针特性的一题

题目

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

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

题解

因为想用双指针所以用了双指针,但是个人感觉对双指针的理解还是比较有利的  
主要是利用两个指针checker和book,前者用来遍历,后者用来处理 
核心在于:当checker检测到0的时候,book不会行动
         而当其检测到非零数的时候,book会更新且移动  

当checker移动到终点时,所有应该加入的非零数已经被添加了,那么剩下的就都是0了    
于是,只要把此时book后面的数全部填充为0即可
class Solution {
    public void moveZeroes(int[] nums) {
        int n = nums.length ;
        int checker = 0 ; //查找用
        int book = 0;       //转换用

        while(checker<n){
            if(nums[checker]!= 0){
                nums[book] = nums[checker];
                book++;
            }

            checker++;
        }

        for(int i = book ; i<n ; i++){
            nums[i] = 0 ;
        }
    }
}

其中一个核心理解是:把book独立于checker存在,因为在每次checker检测的时候,book已经跟进更新数据了
而当checker检测到0的时候,book是不会移动的,在检测到0的时刻,checker和book处于同一个下标,
而下一时刻checker++而 book不变,这样book就被停留在了一个是0的下标处
而当下一次checker检测到非0数的时候,book执行nums[book] = nums[checker];从而抹去了这个零
因为前面的数都排好了,这次也更新了,于是book前进一个下标
如果checker连续检测到了0,那么book就会一直停留,直到checker检测到非0数而更新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值