1. 程式人生 > >Leetcode題解之陣列(7)移動零

Leetcode題解之陣列(7)移動零

題目描述:

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

示例:

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

說明:

  1. 必須在原陣列上操作,不能拷貝額外的陣列。
  2. 儘量減少操作次數。

思路:

解法1:用兩個指標,分別指向最開始和最結尾兩個下標。每次都比較nums[start]的值是否為0,是的話就,將後面的值向前移動,次數為count=end-star,然後將0賦給nums[end],將下表向左移動一步;如果不為0,移動start指標向右移動。繼續比較。

解法2:通過記錄零出現的次數,將陣列每個元素向前移動zeros格並且和零互換。下表i 遇到零就跳過移動過程,zeros+1。下個元素開始移動zeros+1格 以此類推,每個非零的都會與第一個為0的元素互換位置。

//解法1.
class Solution {
    public void moveZeroes(int[] nums) {
        int star=0;
        int end=nums.length-1;
        int count=0;
        
        while(star<end){
            if(nums[star]==0){
                count=end-star;
                for(int i=0;i<count;i++){
                    nums[star+i]=nums[star+i+1];
                }
                nums[end]=0;
                end--;
             }else{
                star++;
               
            }
        }
    }
}
//解法2:
class Solution {
    public void moveZeroes(int[] nums) {
        int zeros=0;
        for(int i=0;i<nums.length;i++){
            if(nums[i]==0){
                zeros++;
            } else if(zeros!=0){
                nums[i-zeros]=nums[i];
                nums[i]=0;
            }
        }
    }
}