思
没有测试调试,啥也不会;初次写成,漏洞百出。这可如何是好。
应当注意此种判断条件,如果下标越界会产生数组越界或者空指针访问。第二次遇到类似问题。提前加入判断。
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++;
}
}
}
呜呜呜呜太感动了,这用时对比,真的行!