刷題筆記 力扣283 移動零

2021-10-24 15:34:17 字數 1656 閱讀 6965

獲得的思考

獲得的思考

給定乙個陣列nums,編寫乙個函式將所有0移動到陣列的末尾,同時保持非零元素的相對順序。

示例:

輸入:[0

,1,0

,3,12

]輸出:[1

,3,12

,0,0

]

說明:

必須在原陣列上操作,不能拷貝額外的陣列。

儘量減少操作次數。

思路:先統計容器中0的個數,刪掉所有的零,並在結尾補零

class

solution

else

++it;

}for

(int i =

0; i < count_0;

++i)

//結尾補0

nums.

push_back(0

);}}

;

這裡在剛開始用了一種迭代器失效的方法,erase以後其實改變了容器元素的排列順序,遍歷下標i其實就失效了,再根據i來遍歷是錯的。erase在刪除乙個迭代器指向的元素後,會返回已刪除元素的下乙個相鄰元素的迭代器,可以用erase的返回值來重置迭代器it,注意此時的for迴圈的++操作應在迴圈體內進行。

//for (int i = 0; i < nums.size(); i++)

//

// }

參考:如何正確刪除vector中的元素

class

solution}}

};

快指標i指向最新的元素,慢指標j指向【已確認的最後乙個非零元素】之後的第乙個0i每次指向新的元素,如果nums[i]非零數,將nums[i]j處的元素(其實是0)交換位置

參考:leetcode回答

還有更好地優化方法在官方回答中

參考:官方回答

測試用例

輸入:[0

,1,0

,3,12

]輸入:[1

,1,0

,3,12

]

這兩個測試用例主要是體會一下快慢指標的更新,手算一下就明白了

輸入:[0

,1,0

,3,12

]輸入:[1

,1,0

,3,12

]

這兩個測試用例主要是體會一下快慢指標的更新,手算一下就明白了

在原陣列上進行刪除某個特定值的元素時,使用erase方法要注意迭代器失效的問題,erase方法會返回已刪除元素的下乙個元素的迭代器,可以用erase返回值來重置迭代器

移動零(力扣第283題)

給定乙個陣列nums,編寫乙個函式將所有0移動到陣列的末尾,同時保持非零元素的相對順序。示例輸入 0,1,0,3,12 輸出 1,3,12,0,0 說明 必須在原陣列上操作,不能拷貝額外的陣列。儘量減少操作次數。解法 借助乙個慢指標,該指標用於指向從最左端開始的非零子陣列的最後乙個元素的後乙個元素,...

力扣刷題記錄 283 移動零

難度 簡單 題目描述 給定乙個陣列nums,編寫乙個函式將所有0移動到陣列的末尾,同時保持非零元素的相對順序。示例 輸入 0,1,0,3,12 輸出 1,3,12,0,0 說明 必須在原陣列上操作,不能拷貝額外的陣列。儘量減少操作次數。解題語言 c 方法 雙指標 力扣官方 思路及解法 使用雙指標,左...

力扣日記 283 移動零

給定乙個陣列 nums,編寫乙個函式將所有 0 移動到陣列的末尾,同時保持非零元素的相對順序。示例 輸入 0,1,0,3,12 輸出 1,3,12,0,0 說明 必須在原陣列上操作,不能拷貝額外的陣列。儘量減少操作次數。方法一 class solution def movezeroes self,n...