這是一道難度爲Easy的問題,但不知道爲什麼,每次做我都會掉入思維誤區,想出超級複雜的方案。今天整理一下,以便加深印象。
問題
Given an array nums, write a function to move all 0’s to the end of it while maintaining the relative order of the non-zero elements.
分析
題目要求將數組中所有的0都移動到末尾,而其餘元素保持原順序。例如數組[0,1,0,3,12],操作後結果爲[1,3,12,0,0]。要求原地執行,且操作次數儘量少。
思路
一個指針i向前遍歷數組,一個指針j遇到0則停一次,每次循環j處元素都賦值爲i處元素。也就是在0未出現時,數組保持不變,0出現1次,i處元素向前移動1位,0出現2次,i處元素向前移動2位,以此類推。知道i指針遍歷結束,終止循環。此時自j指針開始直到數組末尾,都應該用0補位。
class Solution {
public void moveZeroes(int[] nums) {
if (nums == null) {
return;
}
int j = 0;
for (int i=0; i<nums.length; i++) {
if (nums[i] != 0) {
nums[j++] = nums[i];
}
}
for (; j<nums.length; j++) {
nums[j] = 0;
}
}
}
總結
看到題目很容易往處理0的方向上思考,但這道題的解法妙就妙在處理非0,而不是處理0。提交上面的解法,會得到跑贏100%Java的提交的結果,真是生活中的小確幸。