力扣283.移动零(双指针)

双指针

class Solution {
    public void moveZeroes(int[] nums) {
        int j=0;
        for(int i=0;i<nums.length;i++){
            if(nums[i]!=0){
                int tmp=nums[i];
                nums[i]=nums[j];
                nums[j]=tmp;
                j++;
            }
        }
    }
}
  • j是会不断维护他当前位置为0,除了最开始nums[0]!=0这样也可以通过j++保证始终维护0,然后i就寻找该位置不为0的元素和j进行交换

使用数组模拟栈

class Solution {
    public void moveZeroes(int[] nums) {
        int j=0;
        for(int i=0;i<nums.length;i++){
            if(nums[i]!=0){
                nums[j]=nums[i];
                j++;
            }
        }
        Arrays.fill(nums,j,nums.length,0);
    }
}
  • 把数组当做栈来模拟,如果有非0的数就向前移动,最后全部填0
  • 但是这个方法最坏的情况下也就是nums全部都为0,要对数组进行两次遍历 Arrays.fill(arr, fromIndex, toIndex, val)也要隐性地进行一次遍历
posted @ 2025-12-28 11:21  Huangyien  阅读(21)  评论(0)    收藏  举报