題目:給定一個(gè)數(shù)組 nums,編寫一個(gè)函數(shù)將所有 0 移動(dòng)到數(shù)組的末尾,同時(shí)保持非零元素的相對(duì)順序。
示例:
輸入: [0,1,0,3,12]
輸出: [1,3,12,0,0]
說明:
必須在原數(shù)組上操作,不能拷貝額外的數(shù)組。盡量減少操作次數(shù)。
五遍刷題法
第一遍:(完成)
- 5分鐘:讀題 + 思考
- 直接看解法:注意!多解法,分析時(shí)間和空間復(fù)雜度,來比較解法優(yōu)劣
- 背誦、默寫好的解法
解題思路:
1、loop count zeros(第一次循環(huán)先把非零元素放到數(shù)組前面,記錄0的個(gè)數(shù),再遍歷數(shù)組,將count個(gè)最后的元素置零)
2、開一個(gè)新的數(shù)組將非零元素添加到新數(shù)組中,再在數(shù)組結(jié)尾添0(題干提示不允許)
3、直接在數(shù)組上操作index,把非零元素都移動(dòng)到數(shù)組前面。
解法一:兩次循環(huán)
class Solution {
public void moveZeroes(int[] nums) {
if(nums==null) {
return;
}
//第一次遍歷的時(shí)候,j指針記錄非0的個(gè)數(shù),只要是非0的統(tǒng)統(tǒng)都賦給nums[j]
int j = 0;
for(int i=0;i<nums.length;++i) {
if(nums[i]!=0) {
nums[j++] = nums[i];
}
}
//非0元素統(tǒng)計(jì)完了,剩下的都是0了
//所以第二次遍歷把末尾的元素都賦為0即可
for(int i=j;i<nums.length;++i) {
nums[i] = 0;
}
}
}
解法二:違背題意
解法三:雙指針
class Solution {
public void moveZeroes(int[] nums) {
//雙指針的解法
//j記錄非零元素的位置
int j = 0;
for(int i = 0; i < nums.length; i++){
if(nums[i] != 0){
if(i != j){
//交換兩個(gè)元素
nums[j] = nums[i];
nums[i] = 0;
}
j++;
}
//nums[i] == 0就不管
}
}
}
第二遍(完成)
- 馬上自己寫 —> LeetCode 提交
- 多種解法比較、體會(huì) —> 優(yōu)化!
第三遍(待完成)
- 過了一天后,再重復(fù)做題
- 不同解法的熟練程度 —> 專項(xiàng)練習(xí)
第四遍(待完成)
- 過了一周:反復(fù)回來練習(xí)相同題目
第五遍(待完成)
- 面試前一周恢復(fù)性訓(xùn)練