>[success] # Leetcode -- 283 移動零
* 題目描述
給定一個數組 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
~~~
來源:力扣(LeetCode)
鏈接:https://leetcode.cn/problems/move-zeroes
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
>[info] ## 用額外數組接收
**定義一個新數組長度和原數組一樣**,并且數組初始**每個值都為0**,循環原數組找到一個**非0的值**將值從**新數組角標0開始插入**并加**1**,依次知道數組循環結束


>[danger] ##### js 代碼
~~~
/**
* @param {number[]} nums
* @return {void} Do not return anything, modify nums in-place instead.
*/
var moveZeroes = function (nums) {
const { length } = nums
// 生成一個接收
const newArray = new Array(length).fill(0)
// 循環舊數組 如果不是0 插入新數組
let i = 0
for (let key in nums) {
const val = nums[key]
if (val) {
newArray[i++] = val
}
}
nums.forEach((item,index)=>{
nums[index] = newArray[index]
})
}
~~~
>[danger] ##### java 代碼
~~~
class Solution {
public void moveZeroes(int[] nums) {
// 獲取當前數組長度
int len = nums.length;
// 創建一個新數組
int[] newArray = new int[len];
int idx= 0;
for(int i=0;i<len;i++){
if(nums[i] !=0){
newArray[idx++] = nums[i];
}
}
// 重新賦值
for(int i=0;i<len;i++){
nums[i] =newArray[i];
}
}
}
~~~
>[info] ## 雙指針解法
利用**雙指針**,雙指針最開始位置都是**數組起始點**,**快指針**不受任何條件影響每次都會**自增1**,**慢指針**只有在**快指針**所處位置元素**不為0**時候才會前進,此時就會形成**快慢指針**,**落差位置**(形成后慢指針會一直指向0,只要和快指針位置元素交換,就可形成排序)

>[danger] ##### js 解法
~~~
var moveZeroes = function (nums) {
let fast = 0
let slow = 0
while(fast<nums.length){
// 只有當快指針不為0的時候慢指針才移動
if( nums[fast]!==0 ){
// 快慢指針在同一個元素時候不移動
if (slow != fast) {
;[nums[fast], nums[slow]] = [nums[slow], nums[fast]]
}
slow++
}
fast++
}
}
~~~
>[danger] ##### java
~~~
class Solution {
public void moveZeroes(int[] nums) {
// 創建快慢指針
int fast = 0;
int slow = 0;
int temp;
while(nums.length>fast){
// 慢指針只有在快指針不等于0時候才會移動
if(nums[fast] !=0){
// 形成快慢指針進行位置交換
if(fast!= slow){
temp = nums[fast];
nums[fast] = nums[slow];
nums[slow] = temp;
}
slow++;
}
fast++;
}
}
}
~~~
>[info] ## 雙指針解法二
上面雙指針中需要變量交換,交換的過程需要**創建第三方變量用來傳遞**,**變量創建會開辟內存空間**,如果交換的過程**忽略交換**,在最后慢**指針停留位置數據手動更改為0**

* 慢指針后要變0

>[danger] ##### js
~~~
/**
* @param {number[]} nums
* @return {void} Do not return anything, modify nums in-place instead.
*/
var moveZeroes = function(nums) {
// 聲明快慢指針
let fast = 0
let slow = 0
while(nums.length>fast){
if(nums[fast]){
if(fast!=slow){
nums[slow] = nums[fast]
}
slow++
}
fast++
}
while(slow<nums.length){
nums[slow++] = 0
}
};
~~~
>[danger] ##### java
~~~
class Solution {
public void moveZeroes(int[] nums) {
// 快慢指針
int fast = 0;
int slow = 0;
int len = nums.length;
while(fast<len){
// 如果有值滿指針移動
if(nums[fast]!=0){
nums[slow] = nums[fast];
slow++;
}
// 快指針移動
fast++;
}
// 將慢指針后面都歸0
for(int i=slow;i<len;i++){
nums[i] = 0;
}
}
}
~~~
- 刷題準備
- 統計數組中元素出現次數
- Leetcode -- 442數組中重復的數據
- leetcode -- 448 找到所有數組中消失的數字
- 字符類似題
- Leetcode -- 1002 查找共用字符
- Leetcode -- 1370上升下降字符串
- 指針類題解
- Leetcode -- 283 移動零
- Leetcode -- 26. 刪除有序數組中的重復項
- Leetcode -- 80. 刪除有序數組中的重復項 II
- Leetcode -- 27. 移除元素
- Leetcode -- 344. 反轉字符串
- Leetcode -- 125 驗證回文串
- Leetcode -- 11 盛最多水的容器
- Leetcode -- 1480. 一維數組的動態和