LC-283

题目链接: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;
		}
	}
}	
posted @   Ricardo_ML  阅读(21)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
点击右上角即可分享
微信分享提示