力扣每日一题——283.移动零

力扣每日一题——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

猜你喜欢

转载自blog.csdn.net/Seanfly9105/article/details/113401605