題目
remove-element
給定一個數(shù)組 nums 和一個值 val,你需要原地**移除所有數(shù)值等于 *val *的元素,返回移除后數(shù)組的新長度。
不要使用額外的數(shù)組空間,你必須在原地修改輸入數(shù)組并在使用 O(1) 額外空間的條件下完成。
元素的順序可以改變。你不需要考慮數(shù)組中超出新長度后面的元素。
示例 1:
給定 *nums* = **[3,2,2,3]**, *val* = **3**,
函數(shù)應該返回新的長度 **2**, 并且 *nums* 中的前兩個元素均為 **2**。
你不需要考慮數(shù)組中超出新長度后面的元素。
示例 2:
函數(shù)應該返回新的長度 **`5`**, 并且 *nums* 中的前五個元素為 **`0`**, **`1`**, **`3`**, **`0`**, **4**。
注意這五個元素可為任意順序。
你不需要考慮數(shù)組中超出新長度后面的元素。
說明:
為什么返回數(shù)值是整數(shù),但輸出的答案是數(shù)組呢?
請注意,輸入數(shù)組是以“引用”方式傳遞的,這意味著在函數(shù)里修改輸入數(shù)組對于調(diào)用者是可見的。
你可以想象內(nèi)部操作如下:
// **nums** 是以“引用”方式傳遞的。也就是說,不對實參作任何拷貝
int len = removeElement(nums, val);
// 在函數(shù)里修改輸入數(shù)組對于調(diào)用者是可見的。
// 根據(jù)你的函數(shù)返回的長度, 它會打印出數(shù)組中**該長度范圍內(nèi)**的所有元素。
for (int i = 0; i < len; i++) {
print(nums[i]);
}
思路
思路還是挺簡單的不用多少
在這里我想借這道題說兩點看法:
自測
很可能你簡單測試通過之后,就信心滿滿的點擊了提交,但遇到了各種各樣的報錯,甚至最基礎的數(shù)組越界,當然它們或許是不那么容易被發(fā)現(xiàn)的,但這并不是考慮不周全的理由,而在實際工作中也是一樣,各種各樣的問題,盡可能的做好自測,各種邏輯梳理和邊界測試,當你把這些做的越來越好的時候,或許你離bug free就不遠了切勿“翻譯”
當你是其他語言的背景,剛剛接觸一門新的語言的時候,不熟悉它的特性和寫法是正常的,但是學習的意義也就在于此,切忌只是“翻譯”,這會讓你顯得不倫不類,乃至丟失這個語言的一大部分的精華
綜上,之后文章會加兩個部分內(nèi)容
- 加入與優(yōu)秀答案對比,直到自己寫出一樣優(yōu)雅的代碼
- 加入測試反思,列數(shù)自己沒有測到的點
自寫代碼
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
nowp = 0
lastp = len(nums)
if lastp == 0:
return 0
while nowp < lastp:
if nums[nowp] == val:
nums[nowp] = nums[lastp - 1]
lastp = lastp - 1
else:
nowp = nowp + 1
return lastp
優(yōu)雅答案
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
for i in range(nums.count(val)):
nums.remove(val)
return len(nums)
自測反思
- 邊界測試,循環(huán)中的邊界測試,左右邊界
- 空值判斷,這個有點不應該了
以上
歡迎大家關(guān)注我的公眾號
半畝房頂