給定一組整數陣列和一個整數val,需求是刪掉陣列中所有val的數,不在意是否有排序。
特別注意的是,需要將不是val的k個元素放在陣列的前k個,並回傳k(共幾個元素)。
Example 1:
Input: nums = [3,2,2,3], val = 3
Output: 2, nums = [2,2,,]
Explanation: Your function should return k = 2, with the first two elements of nums being 2.
It does not matter what you leave beyond the returned k (hence they are underscores).
Example 2:
Input: nums = [0,1,2,2,3,0,4,2], val = 2
Output: 5, nums = [0,1,4,0,3,,,_]
Explanation: Your function should return k = 5, with the first five elements of nums containing 0, 0, 1, 3, and 4.
Note that the five elements can be returned in any order.
It does not matter what you leave beyond the returned k (hence they are underscores).
想法上與曾經做過的#88類似,比對陣列中每一個值,只要不是val(代表需要留下),就把它從開頭依序存到陣列裡,最後當前存到的位置就是不為val的最後一個index,回傳數量即可。
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int k = 0;
for(int i = 0; i< nums.size(); i++){
if(nums[i] != val){
nums[k] = nums[i];
k++;
}
}
return k;
}
};
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
k=0
for i in range(len(nums)):
if nums[i] != val:
nums[k] = nums[i]
k+=1
return k
看到題目當下,覺得既然不在意順序及大小那就直接刪掉不想要的值,再回傳當前大小即可,但效能上好像沒有上一個解法來得好。
※ 因為 nums 被 erase 刪掉值後,後面的數會往前挪,所以要再檢查一次同個位置,故將 i - 1。
小補充 經過 erase() 後,size 會改變但 capacity 不變
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
for (int i=0; i<nums.size(); i++) {
if (nums[i] == val) {
nums.erase(nums.begin()+i);
i--;
}
}
return nums.size();
}
};
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
while val in nums:
nums.remove(val)
return len(nums)
其實本來要仿照c++寫for loop的,但不知道為甚麼index會超出範圍,還沒弄懂...就換成while寫法了
或許有人知道原因可以跟我分享~ 感謝
for i in range (len(nums)):
if nums[i] == val:
nums.remove(val)
i-=1;
return len(nums)