leetcode刷刷題(41) ---- 移動零(C語言版)

2020-5-6

  • When all the clouds darken up the skyway, there’s a rainbow highway to be found.
    當烏雲密佈,彩虹會爲你鋪就一條道路。

題目

給定一個數組 nums,編寫一個函數將所有 0 移動到數組的末尾,同時保持非零元素的相對順序。

示例:
輸入: [0,1,0,3,12]
輸出: [1,3,12,0,0]

說明:
必須在原數組上操作,不能拷貝額外的數組。
儘量減少操作次數。

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/move-zeroes
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

個人解答:(C版本)

  • 將所有的非0數,把前面的的位置填完即可(比如使用一個變量k記錄,從0開始,遇到一個非0數,就將其填充在k的位置,然後k+1),最後把k及數組後面的數據全部置0,即可完成。
    詳細看下面的代碼。
void moveZeroes(int* nums, int numsSize){
    int NoneZeroPos = 0;
    for(int i=0; i<numsSize; i++)
    {
        if(nums[i] != 0)
        {
            nums[NoneZeroPos++] = nums[i];
        }
    }

    for(int i=NoneZeroPos; i<numsSize; i++)
    {
        nums[i] = 0;
    }
}
  • 複雜度分析
    1)一次循環即可(雖然後面也有一個置0的循環),但是O(2n)=O(n),所以該算法的時間複雜度爲O(n)。
    2)由於只使用了常量空間,空間複雜度爲O(1)。
  • 運行結果:
    在這裏插入圖片描述
他山之石:
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章