1. 程式人生 > 其它 >Leetcode Hot 100 Problems —— 移動零

Leetcode Hot 100 Problems —— 移動零

移動零

問題描述:

給一個數組,將所有0移動到陣列末尾,保持其餘元素位置不變。
空間複雜度只能為O(n)即不能使用輔助陣列。

解法:

使用非同步雙指標,前指標指向前序全非零的最後一個元素的後一位,後指標指向前指標後第一個非零元。

每次將將後指標的值覆蓋到前指標當前位置,前指標後移一位,後指標移動到下一個非零元。

當後指標越界後,前指標從當前位置移動到陣列末尾,沿途所有位置補零。

程式碼描述如下:

#include <iostream>
using namespace std;

void movezero(int nums[],int numsSize){
    if(nums == NULL || numsSize == 0)
        return;
    int j=0;
    for(int i=0;i<numsSize;i++){
        if(nums[i]!=0)
            nums[j++] = nums[i];
    }
    for(int i=j;i<numsSize;i++)
        nums[i] = 0;
}

改進的解法

void movezero_1(int nums[], int numsSize){
    if(nums == NULL || numsSize == 0)
        return;
    int j=0;
    for(int i=0;i<numsSize;i++){
        if(nums[i] != 0){
            if(i != j){
                nums[j] = nums[i];
                nums[i] = 0;
            }
            j++;
        }
    }
}