電商網(wǎng)站制作設計chrome手機安卓版
題目描述:?
給你一個數(shù)組?
nums
?和一個值?val
,你需要?原地?移除所有數(shù)值等于?val
?的元素,并返回移除后數(shù)組的新長度。不要使用額外的數(shù)組空間,你必須僅使用?
O(1)
?額外空間并?原地?修改輸入數(shù)組。元素的順序可以改變。你不需要考慮數(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]); }示例 1:
輸入:nums = [3,2,2,3], val = 3 輸出:2, nums = [2,2] 解釋:函數(shù)應該返回新的長度2
, 并且 nums 中的前兩個元素均為 2。你不需要考慮數(shù)組中超出新長度后面的元素。例如,函數(shù)返回的新長度為 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也會被視作正確答案。示例 2:
輸入:nums = [0,1,2,2,3,0,4,2], val = 2 輸出:5, nums = [0,1,3,0,4] 解釋:函數(shù)應該返回新的長度5
, 并且 nums 中的前五個元素為0
,1
,3
,0
,4
。注意這五個元素可為任意順序。你不需要考慮數(shù)組中超出新長度后面的元素。
解題方法:?
先設定變量 y,指向待插入位置。y初始值為 0
然后從題目的「要求/保留邏輯」出發(fā),來決定當遍歷到任意元素 x 時,應該做何種決策:
如果當前元素 x 與移除元素 val 相同,那么跳過該元素。
如果當前元素 x 與移除元素 val 不同,那么我們將其放到下標y 的位置,并讓 y自增右移。
最終得到的 y?即是答案。
代碼:
class Solution {
public:int removeElement(vector<int>& nums, int val) {int y = 0;for(auto x : nums)if(x != val) nums[y++] = x;return y;}
};