代码随想录二刷第二天(Python)

27. 移除元素

题目链接:https://leetcode.cn/problems/remove-element/

题目描述:给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

示例1:输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]
解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 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,4,0,3]
解释:函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。

题解:

lass Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        fast,slow = 0,0
        size = len(nums)
        while fast < size:
            if nums[fast] != val:
                nums[slow] = nums[fast]
                slow += 1
            fast += 1
        return slow

总结:此题可以通过暴力解法解出,通过两层循环,一层遍历数组,一层更新数组。另一种解法就是定义快慢指针,快指针遍历数组,如果不是目标值就将该值传给慢指针,然后++,如果是目标值就快指针加1,慢指针不变。

26. 删除有序数组中的重复项

题目链接:https://leetcode.cn/problems/remove-duplicates-from-sorted-array/description/

题目描述:给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。返回 k 。

示例1:输入:nums = [1,1,2]
输出:2, nums = [1,2,_]
解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。

示例2:输入:nums = [0,0,1,1,1,2,2,3,3,4]
输出:5, nums = [0,1,2,3,4]
解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。

题解:

class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        fast,slow = 1,1
        size = len(nums)
        if size ==0:
            return 0
        while fast < size:
            if nums[fast] != nums[fast - 1]:
                nums[slow] = nums[fast]
                slow += 1
            fast += 1
        return slow

总结:此题同样可以采用快慢指针法,处理一下快指针指向的值与前一个值是否相等,不相等则将快指针指向的值赋给慢指针。

283. 移动零

题目链接:https://leetcode.cn/problems/move-zeroes/

题目描述:给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。请注意 ,必须在不复制数组的情况下原地对数组进行操作。

示例1:输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]

示例2:输入: nums = [0]
输出: [0]

题解:

class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        fast,slow = 0,0
        size = len(nums)
        while fast < size:
            if nums[fast] != 0:
                temp = nums[slow]
                nums[slow] = nums[fast]
                nums[fast] = temp
                slow +=1
            fast += 1
        return nums

总结:此题采用双指针解法,当快指针指向的不是0,将慢指针暂存,快指针赋给慢指针,暂存的值赋给快指针,遍历数组

844. 比较含退格的字符串

题目链接:https://leetcode.cn/problems/backspace-string-compare/

题目描述:给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true 。# 代表退格字符。注意:如果对空文本输入退格字符,文本继续为空。

示例1:输入:s = “ab#c”, t = “ad#c”
输出:true
解释:s 和 t 都会变成 “ac”。

示例2:输入:s = “ab##”, t = “c#d#”
输出:true
解释:s 和 t 都会变成 “”。

题解:

class Solution:
    def backspaceCompare(self, s: str, t: str) -> bool:
        def f(s):
            while '#' in s:
                i = s.index('#')
                s = s[:max(i - 1, 0)] + s[i + 1:]
            return s
        return f(s) == f(t)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值