[LeetCode] 自我挑战 #27 Remove Element

Remove Element

http://img2.58codes.com/2024/20160759LDen5tUKGl.png

题目说明

给定一组整数阵列和一个整数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).

限制条件

0 <= nums.length <= 1000 <= nums[i] <= 500 <= val <= 100

思路

想法上与曾经做过的#88类似,比对阵列中每一个值,只要不是val(代表需要留下),就把它从开头依序存到阵列里,最后当前存到的位置就是不为val的最后一个index,回传数量即可。

C++ 程式码

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;    }};

Python3 程式码

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。

C++ 程式码

小补充 经过 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();    }};

Python3 程式码

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)

关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章