牛客网刷题笔记131111 Python实现LRU+二叉树先中后序打印+SQL并列排序

从学校步入职场一年多,已经很久没刷过题了,为后续稍微做些提前的准备,还是重新开始刷刷题。

从未做过计划表,这回倒是做了个计划表,希望能坚持吧。

刷题比较随性且量级不大,今天就写了2个算法+2个sql,sql感觉都相对简单且题库没什么好写的,后续考虑将sql的刷题计划改为对理论知识的回温。

算法题牛客网NC93 LRU实现

题目如下:

设计LRU(最近最少使用)缓存结构,该结构在构造时确定大小,假设大小为 capacity ,操作次数是 n ,并有如下功能:

1、Solution(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存

2、get(key):如果关键字 key 存在于缓存中,则返回key对应的value值,否则返回 -1 。

3、set(key, value):将记录(key, value)插入该结构,如果关键字 key 已经存在,则变更其数据值 value,如果不存在,则向缓存中插入该组 key-value ,如果key-value的数量超过capacity,弹出最久未使用的key-value。

要求get跟set的时间复杂度只能为O(1)。

虽然很久没刷题,但好像没有以前那种从未刷过题第一次写不知从何下手的感觉,倒是很顺畅地就写出来了。写完看了一下以往写过的历史记录,发现以前也写过这道题只是题目有所变动,但感觉现在写的更加简洁易懂一些。思路如下:

题目要求写一个LRU的缓存结构,最直接的想法就是用一个字典作为载体,对get与set进行对应的配置:

1、get():每次get操作,如果字典中存在key值,先将value取出后进行删键操作,再重新插入key值进行赋值,同时返回value;若不存在直接返回-1即可。这样子可以保证只要触发get操作,这个key值也会是最近被用过的。

2、set():分为三种情况处理

1)存在key值,与get操作类似,先删键再重新赋值;

2)不存在key值,但字典大小未超过缓存容量要求,这种最简单直接插入新的键值;

3)不存在key值,且字典大小超过缓存容量要求,这种要处理也很容易,取出字典最早,也就是最久没有被用到的键进行删除,可以通过将键值取成列表后取第一个来解决,然后再插入新键值。

代码:

python3 复制代码
class Solution:

    def __init__(self, capacity: int):
        # write code here
        self.capacity = capacity
        self.result = dict()

    def get(self, key: int) -> int:
        # write code here
        if key in self.result.keys():
            output = self.result[key]
            del self.result[key]
            self.result[key] = output
            return output
        else:
            return -1

    def set(self, key: int, value: int) -> None:
        # write code here
        if key in self.result.keys():
            ## key值存在,移除后重新插入
            del self.result[key]
            self.result[key] = value
        elif len(self.result.keys()) < self.capacity:
            ## 缓存大小未超过容量的情况下,插入赋值
            self.result[key] = value
        else:
            ## key值不存在且缓存大小超过容量
            # self.result.popitem()
            del_key = list(self.result.keys())[0]
            del self.result[del_key]
            self.result[key] = value
        # print(list(self.result.keys()))
            
# Your Solution object will be instantiated and called as such:
# solution = Solution(capacity)
# output = solution.get(key)
# solution.set(key,value)

算法题牛客网NC45 二叉树先中后序打印

这个题其实写过,题目还是比较简单的,思路就是直接按先序、中序、后序的需求取值即可。题目如下:

给定一棵二叉树,分别按照二叉树先序,中序和后序打印所有的节点。

数据范围: n ∈ [ 0 , 1000 ] n\in[0,1000] n∈[0,1000],树上每个节点的val值满足#val\in[0,100]#

要求:空间复杂度O(n),时间复杂度O(n)

代码:

python3 复制代码
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param root TreeNode类 the root of binary tree
# @return int整型二维数组
#
class Solution:
    def threeOrders(self , root: TreeNode) -> List[List[int]]:
        # write code here
        preList = []
        midList = []
        lastList = []
        def preOrder(curNode, leftNode, rightNode):
            if curNode:
                preList.append(curNode.val)
            if leftNode:
                preOrder(leftNode, leftNode.left, leftNode.right)
            if rightNode:
                preOrder(rightNode, rightNode.left, rightNode.right)
        
        def midOrder(curNode, leftNode, rightNode):
            if leftNode:
                midOrder(leftNode, leftNode.left, leftNode.right)
            if curNode:
                midList.append(curNode.val)
            if rightNode:
                midOrder(rightNode, rightNode.left, rightNode.right)
        
        def lastOrder(curNode, leftNode, rightNode):
            if leftNode:
                lastOrder(leftNode, leftNode.left, leftNode.right)
            if rightNode:
                lastOrder(rightNode, rightNode.left, rightNode.right)
            if curNode:
                lastList.append(curNode.val)
        
        if root:
            preOrder(root, root.left, root.right)
            midOrder(root, root.left, root.right)
            lastOrder(root, root.left, root.right)
        print([preList, midList, lastList])
        return [preList, midList, lastList]

MYSQL牛客网256 返回三次以上相同积分的情况

题目:

比较简单,直接groupby即可,稍微注意要按升序排序,所以指定的ASC。代码如下:

sql 复制代码
select number
from (select number, count(1) as cnt from grade group by number) t1
where cnt >= 3
order by number asc

MYSQL牛客网257 通过的题目排名

题目:

题目本身不难,这里主要记录下三种排序函数用法row_numberrankdense_rank

  1. row_number(): 不存在并列的情况,用法 row_number() over(partition by xx1 order by xx2 desc/asc) as rnk,假如用在本题,则id为1、6的排名会分别为2、3,不出现并列排名的情况 。
  2. rank(): 存在并列的情况,但并列后的顺序会出现跳过的情况。假如用在本题,则id为1、6的排名均为2,但id为2的排名会为4。
  3. dense_rank(): 存在并列的情况,且并列后的顺序正常排序。即为题目要求的顺序。

这里注意一点,本题只根据number排序,所以不用partition by。代码如下:

sql 复制代码
select *, dense_rank() over (order by number desc) as t_rank
from passing_number
order by t_rank asc, id asc
相关推荐
Helena__a23 分钟前
CV 图像处理基础笔记大全(超全版哦~)!!!
图像处理·人工智能·笔记
游客52029 分钟前
设计模式-结构型-桥接模式
开发语言·python·设计模式·桥接模式
Pandaconda35 分钟前
【新人系列】Python 入门(二十五):Socket 网络编程
开发语言·网络·笔记·后端·python·面试·网络编程
Rinai_R36 分钟前
MySQL学习记录1【DQL和DCL】
数据库·笔记·学习·mysql
s_little_monster40 分钟前
【Linux】Linux常见指令(上)
linux·运维·服务器·经验分享·笔记·学习·centos
风_流沙43 分钟前
【python基础】python中copy用法
开发语言·python
圆圆滚滚小企鹅。1 小时前
刷题记录 回溯算法-5:17.电话号码的字母组合
数据结构·python·算法·leetcode
纪伊路上盛名在1 小时前
从视频中截取ppt,整理为pdf
笔记·学习·计算机视觉·pdf·powerpoint·音视频·学习方法
厦0041 小时前
【MySQL】MVCC详解, 图文并茂简单易懂
数据库·sql·mysql·mvcc·并发控制·undo日志
ZWZhangYu1 小时前
【Arthas命令实践】heapdump实现原理
java·开发语言·python