题目链接
题目描述
实现代码
思路:由于题目要求不能复制数据,可以看成是要求常数级空间复杂度;
我们可以从前往后对数组进行遍历,给与一个标记step和一个索引标记needChange,如果遍历找到了0,则修改标记step,表示后面的遍历都需要前移,同时通过needChange记录前移的位置;在遍历完成之后还需要将所有0放入数组尾部,通过needChange进行判断遍历至数组尾部添加0即可;
实现代码如下:
class Solution {
public void moveZeroes(int[] nums) {
int len = nums.length;
if(len == 1) {
return;
}
int step = 0;
int needChange = -1;
for(int i=0; ; ) {
if(i>len-1) {
break;
}
if(nums[i] == 0) {
if(needChange == -1) {
needChange = i;
}
step++;
i++;
continue;
}
if(step != 0) {
nums[needChange] = nums[i];
needChange++;
i++;
continue;
}
i++;
}
if(needChange != -1) {
for (; needChange < len; needChange++) {
nums[needChange] = 0;
}
}
return;
}
}