思路

双指针

如果左指针 为0,

右指针 去找非0,然后左右交换

直到:

1-结束 

2-后面都是0

{

          l r

1 2 3 4 0 0 0 0

}

2. 其他写法

计数法

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

        for (int i= nums.length-c;i< nums.length;i++){
            nums[i]=0;
        }


    }
}

代码

class Solution {
    public void moveZeroes(int[] nums) {
      //外层循环
            for (int left = 0; left <=nums.length-1; left++) {
                //左指针 如果为0
                if (nums[left] == 0) {
                    //1.设置右指针为 左+1
                    int right=left+1;
                    //2.右指针循环,右-末尾
                    for (right = left+1; right <= nums.length-1 ; right++) {
                        //如果右 非零,和左指针交换,
                        if (nums[right]!=0){
                            int temp=nums[left];
                            nums[left]=nums[right];
                            nums[right]=temp;
                            break;
                        }
                    }
                    //3.如果循环结束,说明没找到非零,移动完整结束,break
                    if (right==nums.length) {
                        break;
                    }
                }
                //不为0,直接继续


            }

    }
}

总结

1.break  的2种i情况

1. 清楚当前 循环的使命,如果使命达到,就可以break

2.如果某种情况,可以整个循环就不用继续了,那就也break

2. 右指针 为 左+1,为什么不用考虑越界

代码只有左==0,才进入代码块

可能越界的情况:

只有下面2个,左指针在最后一个0,1-前面为0,2-前面不为0

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐