Leetcode-283-移動零

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

例如, 定義 nums = [0, 1, 0, 3, 12],調(diào)用函數(shù)之后,nums 應(yīng)為 [1, 3, 12, 0, 0]

注意事項:

必須在原數(shù)組上操作,不要為一個新數(shù)組分配額外空間。
盡量減少操作總數(shù)。


分析:

題目不難理解,把非0元素向前移動,把0向后移動。最后讓數(shù)組的前段都是原順序的非零元素,數(shù)組后段都是0即可。題目要求不能創(chuàng)建新數(shù)組,那么需要想辦法在原數(shù)組上下功夫。

下面給出兩種解法:

解法一:

仔細分析題意,可以遍歷數(shù)組,如果遇到0,那么和右邊的第一個非零元素進行交換,然后再判斷下一個元素是否為0。類似于冒泡的行為。這種方法注重移動元素的過程,時間復(fù)雜度高,速度慢!
Java解答如下:

    public void moveZeroes(int[] nums) {
        if (nums == null || nums.length == 0 || nums.length == 1) {
            return;
        }
        int j = 0;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] == 0) {
                j = i + 1;
                while (j < nums.length) {
                    if (nums[j] != 0) {
                        nums[i] = nums[i] ^ nums[j];
                        nums[j] = nums[i] ^ nums[j];
                        nums[i] = nums[i] ^ nums[j];
                        break;
                    }
                    j += 1;
                }
            }
        }
    }

解法二:

仔細觀察運行之后的結(jié)果,我們可以發(fā)現(xiàn),不需要管中間移動的過程,只關(guān)注最終的結(jié)果即可。只要把數(shù)組中所有的非零元素,按順序給數(shù)組的前段元素位賦值,剩下的全部直接賦值0,一切都OK了。這種方法時最快的!

Java解答如下:

    public void moveZeroes(int[] nums) {
        if (nums == null || nums.length == 0 || nums.length == 1) {
            return;
        }
        int index = 0;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] != 0) {
                nums[index] = nums[i];
                index += 1;
            }
        }
        for (int i = index; i < nums.length; i++) {
            nums[i] = 0;
        }
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 給定一個數(shù)組 nums, 編寫一個函數(shù)將所有 0 移動到它的末尾,同時保持非零元素的相對順序。 例如, 定義 nu...
    拉面小魚丸閱讀 220評論 0 0
  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗。 張土汪:刷leetcod...
    土汪閱讀 12,927評論 0 33
  • 本文內(nèi)容為練習(xí)LeetCode題目時的解題思路和不同算法的記錄,實現(xiàn)語言為C++,代碼保存在Github,均已在L...
    SK木眠閱讀 1,121評論 0 0
  • 轉(zhuǎn)載自:https://egoistk.github.io/2016/09/10/Java%E6%8E%92%E5...
    chad_it閱讀 1,072評論 0 18
  • 學(xué)員都想學(xué)車的時候價格能便宜一點,所以某些教練就看準(zhǔn)了學(xué)員想占便宜這個弱點,用低價吸引學(xué)員報名。這個低價不是正常的...
    美的駕校_金梁閱讀 691評論 3 0

友情鏈接更多精彩內(nèi)容