1. 程式人生 > >leetcode刷題--基礎陣列--移動零(C)

leetcode刷題--基礎陣列--移動零(C)

  1. 給定一個數組 nums,編寫一個函式將所有 0 移動到陣列的末尾,同時保持非零元素的相對順序。 示例: 輸入: [0,1,0,3,12] 輸出: [1,3,12,0,0] 說明: 必須在原陣列上操作,不能拷貝額外的陣列。 儘量減少操作次數。

思想:這個和之前的從排序陣列中刪除重複項很類似,雖然從題目上看“刪除重複項”和“移動零”差別有點大,但是其中的忽略重複項和忽略重複零的思想是類似的,具體來說就是在一次遍歷的過程中,遇到“0”就直接跳過,非0元素就插入nums[j] 後(這邊用指標 j,記錄陣列中的非0元素個數)。最後將陣列剩餘元素都賦值為0。

// 時間複雜度O(n), 空間複雜度O(1)
void moveZeroes(int* nums, int numsSize) {
    int temp = nums[0];
    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;
}