Leetcode字符串算法
【LeetCode-python 7.整数反转】
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例1
输入: 123
输出: 321
示例2
输入: -123
输出: -321
示例3
输入: 120
输出: 21
代码实现
class Solution: def reverse(self, x: int) -> int: sign = 1 if x>0 else -1 stringre = str(abs(x)) sumre = 0 for num, value in enumerate(stringre): sumre += int(value)*(10**int(num)) return sign*sumre*(sumre<2**31)
class Solution(object):
def reverse(self, x):
"""
:type x: int
:rtype: int
"""
sign = 1 if x>0 else -1
x = abs(x)
stack = []
while x>=1:
stack.append(x%10)
x = x / 10
res = 0
i = 0
while stack:
res += stack.pop() * 10**i
i += 1
return res*sign*(res<2**31)
【LeetCode-python 14.最长公共前缀】
难度:简单 类型: 数组,字符串
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例1
输入: ["flower","flow","flight"]
输出: "fl"
示例2
输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。
思路:
重要用python中的zip函数, 它接收可迭代的对象, 把所有元素中,每个元素对应的元素,打包成元祖为元素的列表(现在是对象需要用list转换)
例如:
lis = ['fdss','frge']
lisx = list(zip(*lis))
print(lisx)
作者:Rye_frenzy
链接:https://leetcode-cn.com/problems/longest-common-prefix/solution/my-leetcode-share-4-by-rye_frenzy/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
class Solution: def longestCommonPrefix(self, strs: List[str]) -> str: s = "" for i in zip(*strs): if len(set(i)) == 1: s += i[0] else: break return s
3.无重复字符的最长子串
难度:中等 类型: 字符串、双指针
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例1
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例2
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例3
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
解题思路
双指针:
指针l指在头,另一个指针r滑动遍历,在字典中记录遇到过的字符及下标
若指针r指向的字符没有出现过,记录并更新当前字串的长度
若出现过,l移到上次出现的坐标的下一位,不用比较当前的长度,因为当前的长度一定小于上一次的长度
直到r指向字符串最后一位
代码实现
class Solution(object):
def lengthOfLongestSubstring(self, s):
"""
:type s: str
:rtype: int
"""
start = 0
usedChar = {}
max_len = 0
for i in range(len(s)):
if s[i] in usedChar and usedChar[s[i]] >= start:
start = usedChar[s[i]] + 1
else:
max_len = max(max_len, i-start+1)
usedChar[s[i]] = i
return max_len
作者:wzNote
链接:https://www.jianshu.com/p/8efdc637f78d
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
LeetCode-python 13.罗马数字转整数
难度:简单 类型:字符串
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。
字符 数值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。
通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:
I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。
示例1
输入: "III"
输出: 3
示例2
输入: "IV"
输出: 4
示例 3:
示例3
输入: "IX"
输出: 9
示例 4:
示例4
输入: "LVIII"
输出: 58
解释: L = 50, V= 5, III = 3.
示例5
输入: "MCMXCIV"
输出: 1994
解释: M = 1000, CM = 900, XC = 90, IV = 4.
解题思路
当前位的后一位大于当前位时,用减法
代码实现
1 2 3 4 5 6 7 8 9 10 11 | class Solution: def romanToInt( self , s: str ) - > int : listdic = { "I" : 1 , "V" : 5 , "X" : 10 , "L" : 50 , "C" : 100 , "D" : 500 , "M" : 1000 } sum_result = 0 for k in range ( 0 , len (s) - 1 ): if listdic[s[k]] < listdic[s[k + 1 ]]: sum_result - = int (listdic[s[k]]) else : sum_result + = int (listdic[s[k]]) sum_result + = int (listdic[s[ - 1 ]]) return sum_result |
443. 压缩字符串
1 2 3 4 5 6 7 8 9 10 11 12 13 | class Solution( object ): def compress( self , chars): anchor = write = 0 for read, c in enumerate (chars): if read + 1 = = len (chars) or chars[read + 1 ] ! = c: chars[write] = chars[anchor] write + = 1 if read > anchor: for digit in str (read - anchor + 1 ): chars[write] = digit write + = 1 anchor = read + 1 return write |
643. 子数组最大平均数 I
https://leetcode-cn.com/problems/maximum-average-subarray-i/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?