283.移動零
- 題目
- 示例
- 示例1
- 示例2
- 解題思路
- 快慢指針
- 實現設計
- 詳細代碼
題目
給定一個數組 nums,編寫一個函數將所有 0 移動到數組的末尾,同時保持非零元素的相對順序。
請注意 ,必須在不復制數組的情況下原地對數組進行操作。
示例
示例1
輸入:nums = [0,1,0,3,12]
輸出:[1,3,12,0,0]
示例2
輸入:nums = [0]
輸出:[0]
解題思路
快慢指針
- 題目要求我們將所有的零移動到數組末尾,其實等同于將所有非零元素移動到數組開頭。我們可以將所有非零元素移動到數組開頭,然后將之后的元素賦值為零。
- 我們可以定義兩個指針,快指針和慢指針。快指針找非零元素,慢指針指向非零元素要換到的地方。
實現設計
- 快指針
fast
和慢指針slow
都初始化為0 - 用快指針
fast
遍歷數組,找到非零元素,將非零元素,放到慢指針slow
所指向的位置,同時,慢指針slow
后移。 - 當快指針
fast
遍歷數組結束,即證明所有非零元素都移動到了數組開頭,此時慢指針slow
指向非零元素的后一位,所以,我們只需要將慢指針slow
到數組末尾的元素全部賦值為0即可
詳細代碼
class Solution {public void moveZeroes(int[] nums) {//快指針找非零元素int fast=0;//慢指針指向非零元素要換到的地方。int slow = 0;//遍歷快指針fastwhile(fast<nums.length){if(nums[fast]!=0){//將非零元素放到slow指向的位置nums[slow]=nums[fast];slow++;}fast++;}//遍歷結束,所有非零元素都在元素開頭//slow指向非零元素后一位,將slow到最后的元素全部賦值為0for(int i=slow;i<nums.length;i++){nums[i]=0;}}
}