H**********5 发帖数: 2012 | 1 比如这个
http://blog.gainlo.co/index.php/2016/11/18/uber-interview-question-move-zeroes/
一开始看效率果然很高,我就用java实现,随便跑个test居然是个错误结果。
public static void moveZeroes(int[] nums) {
int right = nums.length-1;
int operations=0;
for(int left = 0; left < nums.length; left++){
if(left>right){
nums[left]=0;
operations++;
continue;
}
if(nums[left] != 0){
continue;
}
nums[left]=nums[right];
operations++;
right--;
}
System.out.println(operations);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] nums={2,0, 1, 0, 3, 12,0,4,23,12,0};
//int[] nums={1, 2, 0, 3, 0, 1, 2};
moveZeroes(nums);
for(int i:nums)
System.out.print(i+" ");
}
他的operations次数确实少 | w*******o 发帖数: 113 | 2 这个和283的区别在于这个不要求保留原来非零数的顺序。
估计这个作者的思路是
左指针指向零,然后右指针的非零数覆盖左指针的值。
但是他忽略了一种情况就是右指针的值也可能指向0.
比如说[2,0,1,0]
这时候把后面的零赋值给前面就会造成错误。
可以在for循环的第二个if语句后加上:
while (nums[right] == 0) right--;
我的代码如下:
public void moveZeroes(int[] nums) {
int l = 0;
for (int n : nums) if (n != 0) nums[l++] = n;
while (l < nums.length) nums[l++] = 0;
} | H**********5 发帖数: 2012 | 3 对的,这个码就是最优解了。
【在 w*******o 的大作中提到】 : 这个和283的区别在于这个不要求保留原来非零数的顺序。 : 估计这个作者的思路是 : 左指针指向零,然后右指针的非零数覆盖左指针的值。 : 但是他忽略了一种情况就是右指针的值也可能指向0. : 比如说[2,0,1,0] : 这时候把后面的零赋值给前面就会造成错误。 : 可以在for循环的第二个if语句后加上: : while (nums[right] == 0) right--; : 我的代码如下: : public void moveZeroes(int[] nums) {
|
|