《热题100》字符串、双指针、贪心算法篇

2023-11-17

思路:对于输入的的字符串,只有三种可能,ipv4,ipv6,和neither

ipv4:四位,十进制,无前导0,小于256

ipv6:八位,十六进制,无多余0(00情况不允许),不为空

class Solution:

    def solve(self , IP: str) -> str:

        if '.' in  IP: #有可能是IPV4

            res = IP.split('.')

            if len(res) == 4: #满足4位

                for i in res:

                    try: #满足十进制

                        a = int(i)

                    except:

                        return "Neither"

                    else:

                        if len(str(int(i))) != len(i): #前导0判断

                            return "Neither"

                        elif int(i) > 255: #255判断

                            return "Neither"

                return "IPv4" #如果没有提前盘错退出,就一定是IPV4

            else:

                return "Neither"

        elif ':' in IP: #有可能是IPV6

            res = IP.split(':')

            if len(res) == 8: #满足8位

                for i in res:

                    try: #满足16进制

                        a = int(i,16)

                    except:

                        return "Neither"

                    if i == '' or i.count('0') == len(i) and len(i) != 1 or len(i) > 4: #非空,16比特,0不多余

                        return "Neither"

                return "IPv6"

            else:

                return "Neither"

        else:

            return "Neither"

思路:让两个指针i j,分别从两个字符串的最后一位开始向前遍历,设置进位ind,当i j都没有走到-1时,如果当前和a = i+j+ind大于9,那就res.insert(0,a-10),将ind置为1,如果当前和小于等于9,res.insert(0,a),将ind置为0.

跳出循环之后,将剩余的部分和ind继续加和,如果没有剩余,ind为1,就把ind insert到首位。

class Solution:

    def solve(self , s: str, t: str) -> str:

        ind = 0 #进位

        i,j = len(s)-1,len(t)-1

        res = []

        while i >= 0 and j >= 0:

            a = int(s[i]) + int(t[j]) + ind

            if a <= 9:

                res.insert(0,str(a))

                ind = 0

            else:

                ind = 1

                res.insert(0,str(a-10))

            i -= 1

            j -= 1

        if i == -1:

            while j >= 0: 继续遍历剩下的

                a = int(t[j]) + ind

                if a <= 9:

                    res.insert(0,str(a))

                    ind = 0

                else:

                    ind = 1

                    res.insert(0,str(a-10))

                j -= 1

        if j == -1:

            while i >= 0: 继续遍历剩下的

                a = int(s[i]) + ind

                if a <= 9:

                    res.insert(0,str(a))

                    ind = 0

                else:

                    ind = 1

                    res.insert(0,str(a-10))

                i -= 1

        if i == -1 and j == -1 and ind != 0: #还有进位

            res.insert(0,str(ind))

        return ''.join(res)

思路:先将区间按照start进行排序(从小到大),从前往后遍历区间[1,len-1],当前区间和前面的区间比较,有三种可能:当前区间被前面的区间完全覆盖,当前区间start在前一个区间内,end超出了前一个区间。这两种情况都可以直接更新当前的区间i.start = min(i-1.start,i.start),i.end = max(i-1.end,i,end)。最后一种情况是当前区间的start比前一个区间的end大,两个区间不重复,这种情况下就把前一个区间加入res中。(前一个区间是合并后的)。在最后将最后一个区间加入res。

class Solution:

    def merge(self , intervals: List[Interval]) -> List[Interval]:

        intervals = sorted(intervals,key=lambda x: x.start) #排序

        res = []

        if len(intervals) <= 1: #特殊判断

            return intervals

        i = 1

        while i < len(intervals):

            if intervals[i].start <= intervals[i-1].end: #更新区间

                intervals[i].start = min(intervals[i-1].start,intervals[i].start)

                intervals[i].end = max(intervals[i-1].end,intervals[i].end)

            else: #加入res

                res.append(intervals[i-1])

            i += 1

        res.append(intervals[len(intervals)-1])

        return res

思路:用双指针(滑动窗口)和哈希表来做。首先进行特殊判断:如果len(T)>len(S)或者len(T)是空或者len(S)是空,以及T中有元素不在S中,都要输出空。

然后left=0,right=1开始遍历字符串,如果当前S[left:right]包含的每一个key(T中的字符串)的数量都大于等于d[key],就找到了一个符合的子串,left+=1,查看答案ans与right-left+1比较大小,如果小就更新ans。如果窗口不符合,先判断right是否到达了len(S),如果没到达就更新right+=1,到达后,就更新left+=1来改变窗口。

import collections

class Solution:

    def minWindow(self , S: str, T: str) -> str:

        d1 = collections.Counter(S) #都改成哈希表查找会更快

        d2 = collections.Counter(T)

        res = [i for i in d2 if i not in d1]

        if len(res) or len(S) == 0 or len(T) == 0 or len(T) > len(S): #特殊判断

            return ''

        left,right = 0,1

        ans = S #答案最开始用较长字符串表示

        while right > left:

            if all(S[left:right].count(key) >= d2[key] for key in d2): #符合的子串窗口出现

                if right-left+1 <= len(ans): #判断与答案的大小

                    ans = S[left:right]

                left += 1 #更新窗口

            else:

                if right < len(S):

                    right += 1

                else:

                    left += 1

        return ans

思路:双指针,滑动窗口,如果当前arr[right]在arr[left:right]中,就更新答案,然后移动左指针,如果不在,就移动右指针。最后要考虑一个情况,就是right一直不在,到len(arr)-1后退出循环,所以在返回前,要再次更新ans = max(ans,right-left)。

class Solution:

    def maxLength(self , arr: List[int]) -> int:

        if len(arr) <= 1:

            return len(arr)

        left,right = 0,1

        ans = 0

        while right < len(arr):

            if arr[right] not in arr[left:right]:

                right += 1

            else:

                ans = max(ans,right-left)                

                left += 1

        ans = max(ans,right-left)

        return ans

思路:使用贪心算法求解,我们想要求最大的面积,所以要么底边比较大,要么高度高。用相对指针先保证底边最大,然后向里移动,每次移动较小的值,保证长边被保留下来。每次都计算area,并且更新ans。

class Solution:

    def maxArea(self , height: List[int]) -> int:

        if len(height) < 2: #特殊情况判断

            return 0

        area = 0

        ans = 0

        left,right = 0,len(height)-1 #相对指针

        while left < right:

            area = (right-left)*(min(height[left],height[right])) #计算面积更新答案

            ans = max(ans,area)

            if height[left] < height[right]: #每次都移动较小的边长

                left += 1

            else:

                right -= 1

        return ans

思路:相向双指针,先确定两个边界p1,p2,移动较小边界,如果当前值小于该边界,ans+=差值。如果大于,就更新边界。当left == right时退出

class Solution:

    def maxWater(self , arr: List[int]) -> int:

        if len(arr) <= 2: #特殊判断

            return 0

        left,right = 0,len(arr)-1 #相向双指针

        ans = 0

        p1,p2 = arr[left],arr[right] #设置边界

        while left < right:

            if p1 < p2: #移动较小的边界

                left += 1

                if p1 >= arr[left]: #如果当前边界大于当前值,更新ans

                    ans += p1 - arr[left]

                else: #否则更新边界

                    p1 = arr[left]

            else:

                right -= 1

                if p2 >= arr[right]:

                    ans += p2 - arr[right]

                else:

                    p2 = arr[right]

        return ans

思路:用dp存储每个孩子的糖数,初始化为1,遍历第一遍(从左到右),如果i > i-1那么更新dp[i] = dp[i-1]+1。然后遍历第二遍,如果i > i+1那么更新dp[i] = dp[i+1]+1。最后计算dp的和。

class Solution:

    def candy(self , arr: List[int]) -> int:

        if len(arr) <= 1: #特殊判断

            return len(arr)

        dp = [1]*len(arr) #初始化

        for i in range(1,len(arr)): #第一次遍历,如果右边比左边大,就更新dp

            if arr[i] > arr[i-1]:

                dp[i] = dp[i-1] + 1

        for i in range(len(arr)-2,-1,-1): #第二次遍历,如果左边比右边大,而且左边的糖果比右边小

            if arr[i] > arr[i+1] and dp[i] <= dp[i+1]:

                dp[i] = dp[i+1] + 1

        return sum(dp)

class Solution:

    def minmumNumberOfHost(self , n: int, startEnd: List[List[int]]) -> int:

        if n <= 1:

            return n

        start = [i[0] for i in startEnd]

        end = [i[1] for i in startEnd]

        start.sort() #排序

        end.sort()

        j = 0

        res = 0

        for i in range(n):

            if start[i] >= end[j]: #开始的时间比上一个结束的时间大

                j += 1

            else:

                res += 1

        return res

我们是要看有没有区间重叠,如果当前增加了主持人,就可以多一个开始时间,但是依旧要看新的开始时间是否和之前的结束时间重叠。(所以增加主持人的时候j不动)

class Solution:

    def solve(self , n: int, m: int, a: List[int]) -> List[int]:

        if m % n == 0:

            return a

        else:

            x = m%n

            a = a[n-x:] + a[:n-x]

            return a

思路:设置上下左右的边界值,然后开始遍历,从左到右遍历一次,更新up的值,然后判断当前是否还有行:up <= down,然后从上到下遍历,更新right值,之后判断当前时候还有列:left <= right。接着从右往左遍历,更新下边界值,从下往上遍历更新左边界值。跳出循环的条件是左>右,上>下。

class Solution:

    def spiralOrder(self , matrix: List[List[int]]) -> List[int]:

        n = len(matrix)

        if n <= 0:

            return []

        m = len(matrix[0])

        if m <= 0:

            return []

        ans = []

        up,down,left,right = 0,n-1,0,m-1 #设置边界值

        while up <= down and left <= right:

            #从左到右

            for i in range(left,right+1):

                ans.append(matrix[up][i])

            up += 1 #更新上边界

            #从上到下

            if up <= down: #保证还有行

                for i in range(up,down+1):

                    ans.append(matrix[i][right])

                right -= 1 #更新右边界

                if left <= right: #保证还有列

                    #从右到左

                    for i in range(right,left-1,-1):

                        ans.append(matrix[down][i])

                    down -= 1 #更新下边界

                    #从下到上

                    for i in range(down,up-1,-1):

                        ans.append(matrix[i][left])

                    left += 1 #更新左边界

        return ans

思路:取第一列元素,反转之后作为新数组的第一行。

class Solution:

    def rotateMatrix(self , mat: List[List[int]], n: int) -> List[List[int]]:

        res = []

        m = len(mat[0]) #列

        for i in range(m): #遍历列

            a = []

            for j in range(n): #遍历行

                a.append(mat[j][i])

            res.append(a[::-1])

        return res

思路:最近最少使用一般用链表或者栈来实现,如果访问或者更新键值对的时候,就先把原来的删掉,把key插入到队头,每次队满之后,直接pop掉队尾。

class Solution:

 def __init__(self, capacity: int):

    self.res = {}  #存储键值对

    self.lenght = capacity #缓存结构大小

    self.stack = []  #存储键值对的使用频率

 def get(self, key: int) -> int:

    if key in self.res:  #如果key在缓存中,更新stack,然后返回value

        self.stack.remove(key)

        self.stack.insert(0,key)

        return self.res[key]

    else:  #否则返回0

        return -1

 def set(self, key: int, value: int) -> None:

    if key in self.res:  #如果key值在缓存中,更新缓存值,然后更新stack

        self.res[key] = value

        self.stack.remove(key)

        self.stack.insert(0,key)

    else:   #不在要新增数据

        if len(self.stack) == self.lenght: #如果当前缓存满了

            a = self.stack.pop() #弹出栈顶

            del self.res[a]  #删除缓存

        self.stack.insert(0,key) #更新stack和res

        self.res[key] = value

思路:两个哈希表。key_freq = {key:freq}存储出现的key的次数。缓存cache = {freq:{key:value}}

然后使用minfreq来记录当前的最小次数,如果当前的freq==minfreq并且cache中这个freq的长度已经为0,此时更新最小minfreq+1.

这里要用到两个colletions的内置字典,defaultDict和orderedDict。oderedDict是按照key的插入顺序对key进行的排序。可以pop(key),popitem(last = False)将会弹出第一个key,这个就是最小的使用频率下最久不适用的键值。默认是last = True

弹出最后一个键值对。

import collections

class LFU:

    def __init__(self,k) -> None:

        self.key_freq={} # 记录key值和当前key出现的频率

        self.cache=collections.defaultdict(collections.OrderedDict)# 出现频率:{key:value}

        self.lenght = k

        self.minfreq = 0 #当前最小频率

    def set(self,key,value):

        if key in self.key_freq: #存在就更新值,使用次数增加

            freq = self.key_freq[key] #取该key的出现频率

            self.cache[freq].pop(key) #在cache对应的频率中删除这个key

            self.key_freq[key] += 1 #频率加一

            self.cache[freq+1][key] = value #修改cache,让频率+1的键值放入键值对

            if self.minfreq == freq and len(self.cache[freq]) == 0: #是否要修改最小频率

                self.minfreq += 1

        else:

            if self.lenght == len(self.key_freq): #已满,淘汰

                delkey,delvalue = self.cache[self.minfreq].popitem(last=False) #删第一个键值对

                self.key_freq.pop(delkey)

            #插入

            self.key_freq[key] = 1 #第一次出现

            self.cache[1][key] = value 

            self.minfreq = 1

    def get(self,key):

        if key in self.key_freq:

            freq = self.key_freq[key]

            val = self.cache[freq].pop(key)

            self.key_freq[key] += 1

            self.cache[freq+1][key] = val

            if freq == self.minfreq and len(self.cache[freq])==0: #修改最小频率

                self.minfreq += 1

            return val

        else:

            return -1

class Solution:

    def LFU(self , operators: List[List[int]], k: int) -> List[int]:

        ans = []

        a = LFU(k)

        for i in operators:

            if i[0] == 1:

                a.set(i[1],i[2])

            else:

                ans.append(a.get(i[1]))

        return ans

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《热题100》字符串、双指针、贪心算法篇 的相关文章

  • Python setuptools:如何在 setup.py 中添加私有存储库 (gitlab)?

    我上传了 2 个包 它们位于我的 gitlab 存储库中 如果我想使用 pip 将它们安装在我的系统中 这很容易 因为 gitlab 可以帮助您 https docs gitlab com ee user packages pypi rep
  • Flask+Nginx+uWSGI:导入错误:没有名为站点的模块

    我安装为http www reinbach com uwsgi nginx flask virtualenv mac os x html http www reinbach com uwsgi nginx flask virtualenv
  • 切片稀疏(scipy)矩阵

    我将不胜感激任何帮助 以理解从 scipy sparse 包中切片 lil matrix A 时的以下行为 实际上 我想根据行和列的任意索引列表提取子矩阵 当我使用这两行代码时 x1 A list 1 x2 x1 list 2 一切都很好
  • Kivy - 文本换行工作错误

    我正在尝试在 Kivy 1 8 0 应用程序中换行文本 当没有太多文字时 一切正常 但如果文本很长并且窗口不是很大 它只是剪切文本 这是示例代码 vbox BoxLayout orientation vertical size hint y
  • Python从int到string的快速转换

    我正在用 python 求解大量阶乘 并发现当我完成计算阶乘时 需要相同的时间才能转换为字符串以保存到文件中 我试图找到一种将 int 转换为字符串的快速方法 我将举一个计算和 int 转换时间的例子 我正在使用通用的 a str a 但感
  • Tweepy StreamListener 到 CSV

    我是 python 新手 我正在尝试开发一个应用程序 使用 Tweepy 和 Streaming API 从 Twitter 检索数据并将数据转换为 CSV 文件 问题是此代码不会创建输出 CSV 文件 也许是因为我应该将代码设置为在实现例
  • 了解 Python 中的酸洗

    我最近接到一项作业 需要以腌制形式放置一本字典 其中每个键引用一个列表 唯一的问题是我不知道腌制形式是什么 谁能给我指出一些好的资源的正确方向来帮助我学习这个概念 pickle 模块实现了一个基本但强大的算法 用于序列化和反序列化 Pyth
  • 更新 Sqlalchemy 中的多个列

    我有一个在 Flask 上运行的应用程序 并使用 sqlalchemy 与数据库交互 我想用用户指定的值更新表的列 我正在使用的查询是 def update table value1 value2 value3 query update T
  • numpy 使用 datetime64 进行数字化

    我似乎无法让 numpy digitize 与 datetime64 一起使用 date bins np array np datetime64 datetime datetime 2014 n 1 s for n in range 1 1
  • 如何将 self 传递给装饰器?

    我该如何通过self key下面进入装饰器 class CacheMix object def init self args kwargs super CacheMix self init args kwargs key func Cons
  • Python Pandas 根据另一列的总计从另一个数据帧中选择值

    我下面有一个 DataFrame 但我需要根据取消和订单列从每个代码中选择行 假设代码 xxx 的阶数为 6 1 5 1 阶数为 11 我需要一种算法 可以选择满足总共 11 行的行 阶数为 6 5 如果没有行匹配 则选择最接近的 id 并
  • python是带有字符串的运算符行为[重复]

    这个问题在这里已经有答案了 我无法理解以下行为 我正在创建 2 个字符串 并使用 is 运算符来比较它 对于第一种情况 它的工作方式有所不同 对于第二种情况 它按预期工作 当我使用逗号或空格时 它显示是什么原因False与比较is当没有使用
  • 动态 __init_subclass__ 方法的参数绑定

    我正在尝试让类装饰器工作 装饰器会添加一个 init subclass 方法到它所应用的类 但是 当该方法动态添加到类中时 第一个参数不会绑定到子类对象 为什么会发生这种情况 举个例子 这是可行的 下面的静态代码是我试图最终得到的示例 cl
  • 如何使用 Django 项目设置 SQLite?

    我已阅读 Django 文档 仅供参考 https docs djangoproject com en 1 3 intro tutorial01 https docs djangoproject com en 1 3 intro tutor
  • 如何使用 sys.path.append 在 Python 中导入文件?

    我的桌面上有两个目录 DIR1 and DIR2其中包含以下文件 DIR1 file1 py DIR2 file2 py myfile txt 这些文件包含以下内容 file1 py import sys sys path append s
  • 如何使用 Keras ImageDataGenerator 预测单个图像?

    我已经训练 CNN 对图像进行 3 类分类 在训练模型时 我使用 keras 的 ImageDataGenerator 类对图像应用预处理功能并重新缩放它 现在我的网络在测试集上训练得非常准确 但我不知道如何在单图像预测上应用预处理功能 如
  • 处理大文件的最快方法?

    我有多个 3 GB 制表符分隔文件 每个文件中有 2000 万行 所有行都必须独立处理 任何两行之间没有关系 我的问题是 什么会更快 逐行阅读 with open as infile for line in infile 将文件分块读入内存
  • Python:高精度time.sleep

    你能告诉我如何在 Win32 和 Linux 上的 Python 2 6 中获得高精度睡眠函数吗 您可以在中使用浮点数sleep http docs python org library time html time sleep 该参数可以
  • 在 Django shell 会话期间获取 SQL 查询计数

    有没有办法打印 Django ORM 在 Django shell 会话期间执行的原始 SQL 查询的数量 Django 调试工具栏已经提供了此类信息 例如 5 QUERIES in 5 83MS但如何从 shell 中获取它并不明显 您可
  • 长/宽数据到宽/长

    我有一个数据框 如下所示 import pandas as pd d decil 1 decil 1 decil 2 decil 2 decil 3 decil 3 decil kommune AA BB AA BB AA BB 2010

随机推荐

  • Navicat15工具连接PostgreSQL15失败

    1 错误现象及原因 错误现象 错误原因 postgresql 15版本中 pg database 系统表把 datlastsysoid 列删除了 所以造成了此错误 2 解决方法 1 将Navicat工具更新到官网最新版本 2 更换 post
  • uboot SPL framework的前世今生

    一开始只有uboot 没有SPL 后来由于一些原因 参考文献1 有些公司如TI添加了SPL 模块 SPL的作用为 参考文献2 为了提高代码的可重用性 uboot 2012 10中将SPL模块标准化 叫做SPL framework 查看ubo
  • 双指针技巧总结

    一 双指针技巧 情景1 通常 我们只需要一个指针进行迭代 即从数组中的第一个元素开始 最后一个元素结束 然而 有时我们会使用两个指针进行迭代 双指针的典型场景 1 从两端向中间迭代数组 2 一个指针从头部开始 而另一个指针从尾部开始 1 反
  • python获取最大、最小值

    1 获取数组极值 并返回索引 c 10 5 0 5 3 10 15 20 25 print c index min c 返回最小值 print c index max c 返回最大值 2 对series求最值 file path D Rec
  • 【C++】模板初阶

    文章目录 1 文件的编译和链接 1 1编译 1 2链接 2 函数模板 2 1函数模板格式 2 2函数模板的显示实例化 2 3非模板函数和同名函数模板的调用顺序 3 类模板 4 模板声明和定义分离的情况 1 文件的编译和链接 1 1编译 编译
  • (一)linux系统简介, centos简介及特点,设置静态IP,防火墙

    本章重点 linux系统简介及特点 下载安装 网络和防火墙的相关命令 具体内容 linux系统简介 Linux 内核最初只是由芬兰人林纳斯 托瓦兹 Linus Torvalds 在赫尔辛基大学上学时出于个人爱好而编写的 git 代码同步技术
  • [007]爬虫系列

    一 背景 有些时候网站开发者为了反爬 会做一些状态码欺骗的处理 原理如下 例如 浏览器发送一个请求 获取一个js文件 服务器返回状态码 例如 503等 此时浏览器就会按照状态码503给它做相应的处理 即 浏览器为了速度 会清缓存 所以直接s
  • 压力测试工具apache-ab讲解

    最近在做webservices 得到的数据是从德国那边的服务器 要将这些数据整合到现在网站中去 不知道性能如何 就做个压力测试 现在有些压力测试工具都是收费的 在开源的apache中自带个ab工具 就在C Apache2 2 bin ab
  • Leetcode初级算法——链表

    删除链表中的节点 请编写一个函数 使其可以删除某个链表中给定的 非末尾 节点 传入函数的唯一参数为 要被删除的节点 现有一个链表 head 4 5 1 9 它可以表示为 示例 输入 head 4 5 1 9 node 5 输出 4 1 9
  • pycharm使用anaconda

    一 Anaconda 1 简介 Anaconda就是可以方便的对的python包进行管理 并且可以通过可视化界面对虚拟环境进行管理 Anaconda包含大部分python库 且自带jupyter notebook等一系列应用 实在是学习py
  • Anaconda Prompt 如何切换工作路径

    Anaconda Prompt 默认路径 默认路径是你的用户名路径 切换路径 Anaconda Prompt在默认路径下 无法直接cd到其他盘 只能在根目录下进行切换盘符 在用户名路径下 输入cd 切换到根目录 返回根目录 使用cd 切换到
  • Office 之将 PPT 图片完美插入 Word

    将 PPT 图片完美插入 Word 原始文档 https www yuque com lart tools wdg4ww 前言 PPT 提供了简单易用的基本绘图支持 而 Word 则提供了专业的文档撰写和处理的支持 但这些工具并不是独立且互
  • 国内版ChatGPT插件来了,快速帮你阅读分析一本书,拆书神器

    好消息 我们都知道 自 OpenAI 开放插件后 其插件数量一直在迅速增加 据国外网友统计 最新的插件总数已经有 430 个 与 5 月 13 日刚开放时的 74 个相比 增长超过 400 而现在 文心一言网页版也正式添加了插件机制 普通用
  • 数据库操作不再困难,MyBatis动态Sql标签解析

    系列文章目录 MyBatis缓存原理 Mybatis的CachingExecutor与二级缓存 Mybatis plugin 的使用及原理 MyBatis四大组件Executor StatementHandler ParameterHand
  • 网页设计,前端大作业-个人主页网站

    个人主页网站 下载链接在文末 个人介绍 比较简单的一个网站适合初学者学习使用 点我下载
  • 简单有效,如何彻底卸载删除AlibabaProtect.exe

    简单有效 如何彻底卸载删除AlibabaProtect exe Process Hacker https www isharepc com 33781 html
  • Java常量池理解和经典总结

    Java常量池理解和经典总结 一 相关知识 1 什么是常量 第一种 是一个值 这个值本身 我们就叫做常量 整型常量 1024 实型常量 1 024 字符常量 g c w 字符串常量 gcw 逻辑常量 true false 这只是我们平时我们
  • JPEG数据格式分析

    添加链接描述 参考如让 感谢原创分享 JPEG数据分析 分析对象是一幅8x8的jpg图片 如下 图片已被放大并被虚线切分 这里写图片描述 用windows照片查看器查看图片详细信息 信息 参数 大小 667字节 尺寸 8x8 宽度 8像素
  • 【干货】Spring远程命令执行漏洞(CVE-2022-22965)原理分析和思考

    前言 上周网上爆出Spring框架存在RCE漏洞 野外流传了一小段时间后 Spring官方在3月31日正式发布了漏洞信息 漏洞编号为CVE 2022 22965 本文章对该漏洞进行了复现和分析 希望能够帮助到有相关有需要的人员进一步研究 1
  • 《热题100》字符串、双指针、贪心算法篇

    思路 对于输入的的字符串 只有三种可能 ipv4 ipv6 和neither ipv4 四位 十进制 无前导0 小于256 ipv6 八位 十六进制 无多余0 00情况不允许 不为空 class Solution def solve sel