1、題目數組
一、審題spa
二、分析指針
給出一個整形數組,將 0 所有提到後邊,並保持非 0 元素的排列順序。code
2、解答blog
一、思路class
方法1、變量
採用兩個指針,index1 指向 第一個 0 的下標。i 指向新出現的元素的下標。方法
若 nums[i] = 0,則 i++;im
若 nums[i] != 0, 且 i != index1,則交換 i 與 index1 所指向的兩個元素值;且 index1++,i++;img
最終結果爲,將出現的 0 連起來,將後邊的非 0 元素與前邊的 0 序列的最前頭一個進行交換。
public void moveZeroes(int[] nums) { int len = nums.length; int ind1 = 0; for (int i = 0; i < len; i++) { if(nums[i] == 0) { if(nums[ind1] != 0) ind1 = i; continue; } if(i > ind1 && nums[ind1] == 0) { swap(nums, ind1, i); ind1++; } } } private void swap(int[] nums, int i, int j) { int tmp = nums[i]; nums[i] = nums[j]; nums[j] = tmp; }
方法2、
改進:
最終結果爲,非0數全在前邊, 0 在後邊。
public void moveZeroes3(int[] nums) { int j = 0; for (int i = 0; i < nums.length; i++) { if(nums[i] != 0) { if(i != j) swap(nums, i, j); j++; } } }
方法3、
新建變量 insertPos=0; 將非 0 元素直接前移到 insertPos 位置,而後 insertPos++;
最終若 insertPos < len;在將剩下的元素賦值 0;
public void moveZeroes2(int[] nums) { int insertPos = 0; for(int num: nums) if(num != 0) nums[insertPos++] = num; while(insertPos < nums.length) nums[insertPos++] = 0; }