283. 移动零【简单】

没有测试调试,啥也不会;初次写成,漏洞百出。这可如何是好。
应当注意此种判断条件,如果下标越界会产生数组越界或者空指针访问。第二次遇到类似问题。提前加入判断。
while(zeroFlag < nums.length && nums[zeroFlag] != 0)


题目

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
说明:必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。

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

class Solution {
    public void moveZeroes(int[] nums) {
        int zeroFlag = 0, NzeroFlag = 0;
        while(NzeroFlag < nums.length){
            while(zeroFlag < nums.length && nums[zeroFlag] != 0){//找到第一个零
                zeroFlag++;
            }
            NzeroFlag = zeroFlag;
            if(NzeroFlag >= nums.length)//找不到非零
                break;
            while(NzeroFlag < nums.length && nums[NzeroFlag] == 0){
                NzeroFlag++;
            }
            if(NzeroFlag >= nums.length)//找不到非零
                break;
            nums[zeroFlag] = nums[NzeroFlag];
            nums[NzeroFlag] = 0;
            zeroFlag++;
            NzeroFlag++;
        }
        while(NzeroFlag < nums.length){
            nums[NzeroFlag] = 0;
            NzeroFlag++;
        }
    }
}

用时击败了9%的用户。看来还大有可为。这应该是O(n)量级的时间复杂度。完全的双指针。对边界的判断还有一丝凌乱感,因为是后面一点一点调试补充的。需要理一理。


理完了:实际上zeroFlag不断自加一就行了,不需要多余的判断和置零!!太差劲了!

class Solution {
    public void moveZeroes(int[] nums) {
        int zeroFlag = 0, NzeroFlag = 0;
        while(NzeroFlag < nums.length){
            if(nums[NzeroFlag] != 0){
                nums[zeroFlag] = nums[NzeroFlag];
                zeroFlag++;
            }
            NzeroFlag++;
        }

        while(zeroFlag < nums.length){
            nums[zeroFlag] = 0;
            zeroFlag++;
        }
    }
}

呜呜呜呜太感动了,这用时对比,真的行!
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值