首页 > 技术文章 > LC-283

zwtblog 2022-03-04 19:56 原文

题目链接:https://leetcode-cn.com/problems/move-zeroes/

首先想到了快排(简易思想),0为中间点, 把不等于0(注意题目没说不能有负数)的放到中间点的左边,等于0的放到其右边。

class Solution {
    public void moveZeroes(int[] nums) {
        if (nums == null || nums.length == 0) return;
        int slowIndex = 0;
        for (int fastIndwex = 0; fastIndwex < nums.length; fastIndwex++) {
            if (nums[fastIndwex] != 0) {
                if (fastIndwex > slowIndex) {
                    nums[slowIndex] = nums[fastIndwex];
                    nums[fastIndwex] = 0;
                }
                slowIndex++;
            }
        }
    }
}

另解

两次遍历
我们创建两个指针 i 和 j ,

第一次遍历的时候指针j用来记录当前有多少非0元素。即遍历的时候每遇到一个非0元素就将其往数组左边挪,

第一次遍历完后,j指针的下标就指向了最后一个非0元素下标。

第二次遍历的时候,起始位置就从j开始到结束,将剩下的这段区域内的元素全部置为0。

class Solution {
	public void moveZeroes(int[] nums) {
		if(nums==null) {
			return;
		}
		//第一次遍历的时候,j指针记录非0的个数,只要是非0的统统都赋给nums[j]
		int j = 0;
		for(int i=0;i<nums.length;++i) {
			if(nums[i]!=0) {
				nums[j++] = nums[i];
			}
		}
		//非0元素统计完了,剩下的都是0了
		//所以第二次遍历把末尾的元素都赋为0即可
		for(int i=j;i<nums.length;++i) {
			nums[i] = 0;
		}
	}
}	

推荐阅读