移动零——双指针

今天做了一道算法题,刚开始没有思路,直到看到一个点赞超多的评论,看了一遍,逻辑很简单,第一次没看懂,然后去仔细推了一下,结果惊艳到我了!!

题目描述:

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

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

说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。

分析

这个题目是放在双指针模块需要做的,双指针?那我把两个指针放在哪呢?前前,后后,前后?没有思路,不知道用双指针怎么搞。可能是我思考有点少。之后才明白过来:只是把非零的数往前移动,而不是数字交换

代码

class Solution {
    
    
    public void moveZeroes(int[] nums) {
    
    
         int i = 0,j = 0;
            for(i = 0 ; i < nums.length; i++){
    
    
            //i指针去寻找非零的数
                if(nums[i] != 0) {
    
    
                //j指针从数组0位置开始,记录非零数字
                //如果i找到非零的数字,那么就赋值给j指针处。保证相对位置
                    nums[j++] = nums[i];
                }
            }
            while(j < nums.length) {
    
    
            //把所有非零数排序好后,然后把后面的数字全部变成0即可
                nums[j++] = 0;
            }
        }
    }
//个人感觉这个j++用的非常巧妙!!!

总结

这个题自己思考少了,刚开始受到双指针以及题目说明的影响,在一个数组上操作。没想到能把数组看做两个数组来用。看懂这个逻辑后,真的是很简单,可是自己当时就是没想起来。还是太菜,加油加油。