LeetCode第73场双周赛复盘【神策数据】

简介: LeetCode第73场双周赛复盘【神策数据】

第一题:数组中紧跟 key 之后出现最频繁的数字

数组中紧跟 key 之后出现最频繁的数字


题目:


给你一个下标从 0 开始的整数数组 nums ,同时给你一个整数 key ,它在 nums 出现过。


统计 在 nums 数组中紧跟着 key 后面出现的不同整数 target 的出现次数。换言之,target 的出现次数为满足以下条件的 i 的数目:


0 <= i <= n - 2 nums[i] == key 且 nums[i + 1] == target。

请你返回出现 最多 次数的 target 。测试数据保证出现次数最多的 target 是唯一的。


示例:


输入:nums = [1,100,200,1,100], key = 1

输出:100

解释:对于 target = 100 ,在下标 1 和 4 处出现过 2 次,且都紧跟着 key 。

没有其他整数在 key 后面紧跟着出现,所以我们返回 100 。


思路:


本题是首先把数组中的每一个key后面的数都找出来,然后放在一个数组里面,最后通过判断里面数的多少来进行返回。


本题是一个很容易的签到题,大家应该都可以a出来的。我就不多说了直接看代码吧。


代码:


class Solution:
    def mostFrequent(self, nums: List[int], key: int) -> int:
        res = []
        try:
            while nums:
                res.append(nums[nums.index(key) + 1])
                nums[:] =nums[nums.index(key) + 1:]
        except:
            z = 0
            m = 0
            for index,i in  enumerate(res):
                if res.count(i) > m:
                    m = res.count(i)
                    z = index
            return res[z]


第二题:将杂乱无章的数字排序

将杂乱无章的数字排序


给你一个下标从 0 开始的整数数组 mapping,它表示一个十进制数的映射规则,mapping[i] = j表示这个规则下将数位i映射为数位j。


一个整数 映射后的值 为将原数字每一个数位 i (0 <= i <= 9)映射为 mapping[i] 。


另外给你一个整数数组 nums ,请你将数组 nums中每个数按照它们映射后对应数字非递减顺序排序后返回。


注意:


如果两个数字映射后对应的数字大小相同,则将它们按照输入中的 相对顺序 排序。

nums 中的元素只有在排序的时候需要按照映射后的值进行比较,返回的值应该是输入的元素本身。


示例 1:


输入:mapping = [8,9,4,0,2,1,3,5,7,6], nums = [991,338,38]

输出:[338,38,991]

解释:

将数字 991 按照如下规则映射:


mapping[9] = 6 ,所有数位 9 都会变成 6 。

mapping[1] = 9 ,所有数位 1 都会变成 8 。

所以,991 映射的值为 669 。

338 映射为 007 ,去掉前导 0 后得到 7 。

38 映射为 07 ,去掉前导 0 后得到 7 。

由于 338 和 38 映射后的值相同,所以它们的前后顺序保留原数组中的相对位置关系,338 在 38 的前面。

所以,排序后的数组为 [338,38,991] 。


思路:


由题我们能大概的知道这个一个映射关系,所以一般我们会想到使用hash表来进行一个映射关系。但是,如果我们是用了hash就会导致数据的丢失(因为题目没有说给的数组里面的数是否不重复,而hash只能有一个键。如果有重复的数据则会导致后面的数据覆盖前面的映射关系,从而导致数据的一个丢失关系。本人亲测5555…)。


所以我们可以使用一个新的和nums等长的数组对nums里面的每一个数据经行一个映射关系。所以就需要使用我们的map函数。如果不知道Python中map怎么使用的,建议可以去复习一下哦!!!


代码:


class Solution:
    def sortJumbled(self, mapping, nums):
        #设一个函数将每个元素和每个元素的对应值放在一个元组里面!
        def add(x,y):
            return x,y
        #新的数组用来记录nums里面每一个元素的映射值。
        res1 = []
        #对nums进行一个循环,并合成映射值
        for i in nums:
            res = ""
            for j in list(str(i)):
                res += str(mapping[int(j)])
            #把每个元素的映射值放到新数组中。
            res1.append(int(res))
        #让nums的每个元素和新的映射值对应,并返回一个元组类型的列表。
        a = list(map(add,res1 ,nums))
        #用映射值的大小对新数组排序
        c = sorted(a , key = lambda i:i[0])
        #最后返回新的数组
        return [i[1] for i in c]



第三题:有向无环图中一个节点的所有祖先

有向无环图中一个节点的所有祖先


题目:


给你一个正整数 n,它表示一个 有向无环图 中节点的数目,节点编号为 0 到 n - 1 (包括两者)。


给你一个二维整数数组 edges ,其中 edges[i] = [fromi, toi] 表示图中一条从 fromi 到toi的单向边。


请你返回一个数组 answer,其中 answer[i]是第 i个节点的所有 祖先 ,这些祖先节点 升序 排序。


如果u 通过一系列边,能够到达v,那么我们称节点 u 是节点v的 祖先 节点。


示例:


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ENU7WZoq-1646669701715)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20220307235246009.png)]


输入:n = 8, edgeList = [[0,3],[0,4],[1,3],[2,4],[2,7],[3,5],[3,6],[3,7],[4,6]]

输出:[[],[],[],[0,1],[0,2],[0,1,3],[0,1,2,3,4],[0,1,2,3]]

解释:

上图为输入所对应的图。


节点 0 ,1 和 2 没有任何祖先。

节点 3 有 2 个祖先 0 和 1 。

节点 4 有 2 个祖先 0 和 2 。

节点 5 有 3 个祖先 0 ,1 和 3 。

节点 6 有 5 个祖先 0 ,1 ,2 ,3 和 4 。

节点 7 有 4 个祖先 0 ,1 ,2 和 3 。

思路:


本题是一个比较经典的bfs所以我们需要用到队列对子节点和孙子节点进行一个判断。首先我们是把所有从1 - n-1的子节点都统一到一起。


题目要求是输出节点的所有祖先节点且有序。既然我们可以获取该节点的所有子节点,那么对于所有的子节点而言,该节点就是祖先节点之一。

为了保证结果有序,就从节点0开始,BFS查询其子节点,记录子节点的祖先节点,直到节点n-1。

代码:


class Solution:
    def getAncestors(self, n: int, edges: List[List[int]]) -> List[List[int]]:
        dit = [[] for  i in range(n)]
        res = [[] for i in range(n)]
        for i,j in edges:
            dit[i].append(j)
        for i in range(n):
            q = deque(dit[i])
            seen = set(dit[i])
            while q:
                p = q.popleft()
                res[p].append(i)
                for j  in dit[p]:
                    if j not in seen:
                        seen.add(j)
                        q.append(j)
        return res



第四题:得到回文串的最少操作次数

得到回文串的最少操作次数


嗯嗯嗯嗯嗯嗯…刚看了一下应该可以a出来,还没来的急看题目嘿嘿嘿。等我一会补上。


总结

本次周赛目前除了第四题还没a,第三题暴露出我对图和bfs这样的问题比较薄弱,这也是我接下来需要加油努力的地方。


刷题从大二上学期到现在也小半年了,也终于快给我破300了啊啊啊啊。但是还是要补一下自己不足的地方!




相关文章
|
4月前
leetcode-2028:找出缺失的观测数据
leetcode-2028:找出缺失的观测数据
49 0
|
4月前
Leetcode第123场双周赛
在LeetCode的第123场双周赛中,参赛者需解决三个问题。第一题涉及根据给定数组构建三角形并判断其类型,如等边、等腰或不等边,代码实现通过排序简化条件判断。第二题要求找出满足差值为k的好子数组的最大和,解决方案利用前缀和与哈希表提高效率。第三题则需要计算点集中满足特定条件的点对数量,解题策略是对点按坐标排序并检查点对是否满足要求。
17 1
|
4月前
力扣双周赛 -- 117(容斥原理专场)
力扣双周赛 -- 117(容斥原理专场)
|
4月前
|
Go
golang力扣leetcode 442.数组中重复的数据
golang力扣leetcode 442.数组中重复的数据
92 0
【Leetcode】- 第 29 场双周赛
【Leetcode】- 第 29 场双周赛
|
机器人
LeetCode 双周赛 106(2023/06/10)两道思维题
往期回顾:[LeetCode 单周赛第 348 场 · 数位 DP 模版学会了吗?](https://mp.weixin.qq.com/s/4aLHpyaLOUEHSaX2X8e5FQ)
78 0
LeetCode 双周赛 106(2023/06/10)两道思维题
LeetCode-442 数组中重复的数据
LeetCode-442 数组中重复的数据
|
算法 索引
LeetCode 双周赛 107(2023/06/24)滑动窗口与离散化
> **本文已收录到 [AndroidFamily](https://github.com/pengxurui/AndroidFamily),技术和职场问题,请关注公众号 \[彭旭锐] 和 \[BaguTree Pro] 知识星球提问。**
66 0
LeetCode 双周赛 107(2023/06/24)滑动窗口与离散化
|
存储 数据安全/隐私保护