Leetcode題解之陣列(7)移動零
阿新 • • 發佈:2018-12-20
題目描述:
給定一個數組 nums
,編寫一個函式將所有 0
移動到陣列的末尾,同時保持非零元素的相對順序。
示例:
輸入:[0,1,0,3,12]
輸出:[1,3,12,0,0]
說明:
- 必須在原陣列上操作,不能拷貝額外的陣列。
- 儘量減少操作次數。
思路:
解法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; } } } }