问题链接:https://leetcode.com/problems/move-zeroes/
思路:
1. 直观版本,遍历,如果一个数是0,就把它后面的所有不为0的数往前挪。O(n2)
public void moveZeroes(int[] nums) {
int c = 0;
for(int i=0;i<nums.length;i++) {
if(nums[i]==0) {
for(int j=i+1,q=i;j<nums.length;j++) {
if(nums[j]!=0) {
nums[q] = nums[j];
q = j;
}
}
c++;
}
}
for(int i=nums.length-c;i<nums.length;i++) {
nums[i]=0;
}
}
2. 优化,使用一个index记录不为0的最大下标,每遇到一个不为0的数,就给index所在位赋值即可。最后再把index后面的全部置0。O(n)
public void moveZeroes(int[] nums) {
int index = 0;
for(int i=0;i<nums.length;i++) {
if(nums[i]!=0) {
nums[index++] = nums[i];
}
}
for(int i=index;i<nums.length;i++) {
nums[i] = 0;
}
}