【Java】【力扣】283.移动零
·
思路
双指针
如果左指针 为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


更多推荐
所有评论(0)