目錄
解題過程:
描述:
分析條件:
解題思路:
通過這道題可以學到什么:
解題過程:
描述:
?
給定一個數組?nums
,編寫一個函數將所有?0
?移動到數組的末尾,同時保持非零元素的相對順序。
請注意?,必須在不復制數組的情況下原地對數組進行操作。
示例 1:
輸入: nums =[0,1,0,3,12]
輸出:[1,3,12,0,0]
示例 2:
輸入: nums =[0]
輸出:[0]
提示
1 <= nums.length <= 104
-231?<= nums[i] <= 231?- 1
分析條件:
第一遍的思路:(錯誤思路)
當數組的長度為1時,直接返回這個數組
當數組的長度大于1時,我們從數組的第一個數開始遍歷,遇到0,交換
比如 1 0 2? 0 3? 我們就把它變成 1 2 0 3 0 把遇到的第一個0交換到末尾
?
class Solution {public void moveZeroes(int[] nums) {if(nums.length == 1){return;} // 0 1 0 3 12for(int i = 0;i < nums.length;i++){if(nums[i] != 0){continue;}for(int j = i;j < nums.length - 1;j++){int temp = nums[j];nums[j] = nums[j + 1];nums[j + 1] = temp;}}}
}
這種寫法只通過了28/75個用例,原因是?[0,0,1] 如果0連續,那么這種邏輯會漏掉一些0
正確解題思路:
class Solution {public void moveZeroes(int[] nums) { 1 1 0 //1 2 0 3 12int n = nums.length;//left為左指針,left索引左邊的數均為已處理數int left = 0;//rigth為右指針,right索引不斷右移尋找非0數int right = 0;while(right < n){
//(nums[right] != 0時再交換,這段邏輯可以保證left和right一起移動到第一個num[n] = 0處,
//此時left = n,right = n,下一步left = n,right = n + 1,right開始尋找非0數if(nums[right] != 0){int temp = nums[right];nums[right] = nums[left];nums[left] = temp;left++;}right++;}}
}
通過這道題可以學到什么:
1.數組的長度,nums.length 后面不加()!
2.while循環中,我們要用nums[right != 0]作為條件,這樣可以帶著left和right一起移動到數組中第一個0處