CodeTop-0203Day02
Two Problem
- 整数反转: https://leetcode.cn/problems/reverse-integer/
- 无重复字符的最长子串: https://leetcode.cn/problems/longest-substring-without-repeating-characters/description/
Q1: 整数反转
本来想用字符串反转的,后来发现“不允许 64 位整数”限制,那么在构建结果时会面临溢出问题.
而且发现没有注意返回值是int, 哈哈,本来甚至直接返回字符串了->要仔细审题哦~
Answer One: 逐位弹出+数值构造(每次更新前做溢出预判)
class Solution:
def reverse(self, x: int) -> int:
# 边界定义
INT_MAX=2**31-1 # 2147483640 + 7
INT_MIN=-2**31 # -2147483648
# 计算符号
sign = -1 if x < 0 else 1
# 边界值限制
limit = INT_MAX%10 if sign == 1 else abs(INT_MIN)%10
x=abs(x)
# 每次计算一位数字, 累加到ans中
res = 0
while x:
digit = x%10
x//=10
# 先判断再计算, 避免计算结束后进不了下一轮循环直接输出导致溢出
if res > INT_MAX//10 or ( res == INT_MAX//10 and digit > limit ): return 0
res = res*10+digit
# 添加符号
res *=sign
# 返回结果
return res
Q2: 无重复字符的最长子串
通过滑动窗口解决连续区间问题
Answer One: 滑动窗口(set实现)
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
# set做滑动窗口
seen = set()
l = 0
ans = 0
for r in range(len(s)):
# 右边界重复时候, 重置左边界:直到删除到set中没有右边界为止
while s[r] in seen:
seen.remove(s[l])
l += 1
# 加入右边界并更新ans
seen.add(s[r])
ans = max(ans, r-l+1)
return ans
Answer Two: 滑动窗口(哈希表dict实现)
用哈希表(dict) 记录“最后出现位置”, 解决set遇到重复,要一格一格删的问题
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
# 哈希表(dict)做滑动窗口
# 存储: <字符,索引> - <ch,idx>
last = {}
l = 0
ans = 0
for r, ch in enumerate(s):
# 字符在窗口内, 即窗口内有重复, 则跳过此重复字符
if ch in last and last[ch] >= l:
l = last[ch] + 1
# 记录新值
last[ch] = r
ans = max(ans, r-l+1)
return ans
Happy Ending
回忆起了滑动窗口的日子,呜呜
晚上吃完饭想起来忘记打卡了, 睡前补齐~~
另外, 今天迫于生计, 学会了将飞书文档转换成.md下载,不想上班,😭
附github地址: https://github.com/dicarne/feishu-backup?tab=readme-ov-file
---XTian by 202602032323

浙公网安备 33010602011771号