python编程实战(六)

题目一:合并有序数组

给你两个按递增顺序 排列的整数数组 nums1nums2,另有两个整数 mn ,分别表示 nums1nums2 中的元素数目。

请你合并 nums2nums1 中,使合并后的数组同样按递增顺序排列。

关键数据结构:

List\[\]一维列表

关键方法:

.append();.sort()排序

关键思路:

nums1和nums2本身都是递增排序的,最简单的方法是直接把nums2中的元素合并到nums1中,然后使用.sort()方法对列表进行递增排序;

另外一种方法是双指针中的快慢指针法,用两个指针分别指向两个列表的头部,逐个比较元素大小,小的就放到新的列表中,然后指针右移动

复制代码
//法一:直接使用python中的sort()方法对合并后的数组排序
class Solution:
    def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
        """
        Do not return anything, modify nums1 in-place instead.
        """
        nums1[m:] = nums2
        nums1.sort()

//法二:使用快慢指针,逐个遍历两个列表中的元素,然后把小的放到新表中
class Solution:
    def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
        sorted = []
        p1,p2=0,0
        while p1 < m or p2 <n:
            if p1 == m:
                sorted.append(nums2[p2])
                p2+=1
            elif p2 == n:
                sorted.append(nums1[p1])
                p1+=1
            elif nums1[p1]<nums2[p2]:
                sorted.append(nums1[p1])
                p1+=1
            else:
                sorted.append(nums2[p2])
                p2+=1
        nums1[:] = sorted
//这里需要注意,如果直接写nums1=sorted,提交是会报错的;因为nums1作为传参,nums1=sorted并不改变其原地址上存储的值,而[:]方法会改变其原地址上的值

题目二:移除元素

给你一个数组 nums和一个值 val,你需要 原地 移除所有数值等于 val的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。

假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作:

  • 更改 nums 数组,使 nums 的前 k 个元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要。
  • 返回 k

关键数据结构:

List\[\]一维列表

关键方法:

.remove();快慢指针

关键思路:

方法一:使用python中的remove方法可以直接把nums中的val元素去除掉,然后测量nums数组的长度k。remove方法是逐个进行删除的,所以需要与while循环搭配使用

方法二:快慢指针。用两个指针指向列表头部,一个指针用来遍历初始列表,另一个指针用来标识不含元素val的新列表

复制代码
//法一:直接用python中的remove()方法,移除指定元素后对统计列表长度即可
class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        while val in nums:
            nums.remove(val)
        return len(nums)

//法二:快慢指针。
class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        k=0
        for i in range(len(nums)):
            if nums[i] != val:
                //下标i对应的列表是旧的列表,下表k对应的列表是把非val元素放在前面的新表
                //最后只需要返回k即可
                nums[k]=nums[i]
                k +=1
        return k

题目三:删除有序数组中的重复项

给你一个 非严格递增排列 的数组 nums ,请你**原地** 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。

考虑 nums 的唯一元素的数量为 k。去重后,返回唯一元素的数量 k

nums 的前 k 个元素应包含 排序后 的唯一数字。下标 k - 1 之后的剩余元素可以忽略。

关键数据结构:

List\[\]列表

关键思路:

快慢指针。同样的定义两个指针,快指针用于遍历整个列表,查找不重复元素;慢指针用于存储不重复元素,并把其覆盖在原列表上。所谓原地删除其实就是用新的元素把旧的元素覆盖,原地删除就是覆盖

复制代码
class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        if not nums:
            return 0
        fast,low = 1,1
        n = len(nums)
        while fast < n:
            //快指针用于遍历列表中的每个元素,并查找出不重复元素
            if nums[fast]!=nums[fast-1]:
                //慢指针来把不重复元素覆盖到原列表上
                nums[low]=nums[fast]
                low+=1
            fast+=1
        //返回不重复元素个数
        return low

题目四:删除有序数组中的重复项之二

给你一个有序数组 nums ,请你**原地** 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。

不要使用额外的数组空间,你必须在 原地修改输入数组并在使用 O(1) 额外空间的条件下完成。

关键数据结构:

列表List\[\]

关键思路:

本题的思路和上一题是一样的,同样可以使用快慢指针,由于列表本身是有序的,判断一个元素是否出现超过两次,直接使用numi-2==numi即可,快指针用于遍历每个元素并查找重复出现两次以上元素,慢指针作为新列表的下标,将其存储起来并覆盖原列表

复制代码
class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        n = len(nums)
        if n<=2:
            return n
        slow,fast =2,2
        while fast <n:
            if nums[slow-2]!=nums[fast]:
                nums[slow]=nums[fast]
                slow+=1
            fast+=1
        return slow 
//本题和上一道题目的关键区别在于判断条件:nums[slow-2]!=nums[fast]
//上一题为:nums[fast-1]!=nums[fast]
//由于本题目要求的是新表中重复出现的数字可以出现至多两次,所以需要和有效表进行比对
//(机械记忆就好)
相关推荐
xiangyun6111 小时前
【408数据结构 08】队列:循环队列判空判满,408年年考,一次讲清
c语言·开发语言·数据结构·c++·算法
xiangyun6111 小时前
【408数据结构 06】双链表、循环链表、静态链表
c语言·开发语言·数据结构·c++·算法
OKkankan12 小时前
LangChain 能力详解!:输出解析、RAG、向量数据库与 Retriever 检索器
数据结构·python·langchain·ai应用
蓝速科技12 小时前
便民服务大厅 AI 数字人一体机场景适配与落地指南丨蓝速科技
大数据·网络·数据结构·人工智能·自然语言处理·数据分析·运维开发
xxwxx__13 小时前
C++ AVL 树深度剖析:平衡二叉搜索树原理、源码与面试考点
数据结构·c++
Logic10113 小时前
C语言/数据结构数组题解:数字列表加一(Plus One)——进位处理与数组扩展
c语言·数据结构·模拟·数组·时间复杂度·算法题·进位
xxwxx__17 小时前
C++ STL set 与 map 全套详解:关联式容器、红黑树底层、代码坑点、刷题实战
数据结构·c++
程曦曦17 小时前
MySQL 生产库误删 98 张表后的时间点恢复实战:从 binlog 解析到资金对账
linux·数据结构·其他·算法·ubuntu·运维开发
郝学胜-神的一滴17 小时前
Effective Python 条款 13:善用星号解包,告别下标切片拆分的坑
服务器·开发语言·数据结构·python·程序人生·pycharm
Logic10118 小时前
C语言/数据结构位运算题解:异或XOR找出流水线上的“独特零件编号“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质