思路:在原本数组里面操作,我们可以借鉴一下冒泡排序的交换操作。

一旦我们遇到0,那么这个时候我们就开始冒泡排序的交换操作,把它换到最后面。

注意:我们在交换之后,第一重循环会直接往下进行判断数,但是我们交换之后,会有数往前去,就相当于我们把0扔到后面了,整体数组是向前移动的。所以我们还是需要从原先的位置判断,这个时候i--,下一次操作的时候还是在原位置进行判断新的数。

还有就是,在我们把0都扔到最后面之后,再次判断末尾的时候会有问题,因为我们每次交换操作之后,会把i--,但是在末尾全是0的时候,我们其实不用进行交换了,也就是交换操作不会进行,但是我们的i还是会递减,这样就造成了一个死循环。

所以我们增加了一个计数变量cnt,每次扔一个0,就加1,然后我们把它放在循环条件里面,减去它,这样我们就不会遍历到后面已经被我们扔到末尾的0了,死循环就不会产生了。

class Solution {
    public void moveZeroes(int[] nums) {
        int cnt=0;
        for(int i=0;i<nums.length-cnt;i++){
            if(nums[i]==0){
                for(int j=i;j<nums.length-1-cnt;j++){
                    int tmp=nums[j+1];
                    nums[j+1]=nums[j];
                    nums[j]=tmp;
                }
                cnt++;
                i--;
            }
        }
    }
}

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部