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数而更新

posted @ 2021-10-30 10:52  RetenQ  阅读(22)  评论(0编辑  收藏  举报