力扣每日一题——283.移动零
题目描述
代码注释
//法一:多次遍历,把非零元素依次移到前面
void moveZeroes(int* nums, int numsSize){
for(int i = 0;i<numsSize;i++){
for(int j =0;j<numsSize-1;j++){
if(nums[j]==0){
nums[j]=nums[j+1];
nums[j+1]=0;
}
}
}
}
//法二:遍历一次把非零元素依次移到前面,后面直接补0
void moveZeroes(int* nums, int numsSize){
int count = 0;
for(int i = 0;i<numsSize;i++){
if(nums[i]!=0){
nums[count]=nums[i];
count++;
}
}
for(int i = count;i<numsSize;i++){
nums[i]=0;
}
}
//法三:双指针法
void moveZeroes(int *nums, int numsSize) {
int left = 0, right = 0;
while (right < numsSize) {
if (nums[right]) {
int temp=0;
temp=nums[left];
nums[left]=nums[right];
nums[right]=temp;
left++;
}
right++;
}
}
反思心得
第一个写出来的法一在显得着实蠢了点。。。。。。时间复杂度直接飙到O(n²) orz