题目简介
344: 反转字符串 https://leetcode.cn/problems/reverse-string/description/
541: 反转字符串II https://leetcode.cn/problems/reverse-string-ii/description/
卡码网:54.替换数字 https://kamacoder.com/problempage.php?pid=1064
151: 翻转字符串里的单词 https://leetcode.cn/problems/reverse-words-in-a-string/description/
卡码网:55.右旋转字符串 https://kamacoder.com/problempage.php?pid=1065
初见思路
344.反转字符串, 双指针快速杀
class Solution:
def reverseString(self, s: List[str]) -> None:
"""
Do not return anything, modify s in-place instead.
"""
l,r = 0, len(s) - 1
while l<r:
s[l],s[r] = s[r],s[l]
l += 1
r -= 1
541反转字符串II(未AC)
class Solution:
def reverseStr(self, s: str, k: int) -> str:
if k == 1:
return s
l,r = 0,0
n = len(s)
ans = list()
while l < n and r < n:
if r - l == 2*k - 1:
ans.append(s[l:r//2+1][::-1])
ans.append(s[r//2+1:r+1])
l = r + 1
r += 1
# post-process
if r > l:
if r - l < 2*k and r -l >= k:
ans.append(s[l:l+k][::-1])
ans.append(s[l+k:])
elif r - l < k:
ans.append(s[l:][::-1])
return ''.join(ans)
初见时候想的双指针模拟,每2K长度翻转前一半,能过大部分用例但是卡在了以下用例,有兴趣大神可以帮debug下:
s:
"krmyfshbspcgtesxnnljhfursyissjnsocgdhgfxubewllxzqhpasguvlrxtkgatzfybprfmmfithphckksnvjkcvnsqgsgosfxc"
k: 20
错误❌情况:
预期结果:
"jlnnxsetgcpsbhsfymrkhfursyissjnsocgdhgfxtxrlvugsaphqzxllwebukgatzfybprfmmfithphccxfsogsgqsnvckjvnskk"
实际结果:
"jlnnxsetgcpsbhsfymrkhfursyissjnsocgdhgfxubewllxzqhpasguvlrxtkgatzfybprfmmfithphccxfsogsgqsnvckjvnskk"
最后借鉴了lc上的比较简洁的一种写法AC了:
class Solution:
def reverseStr(self, s: str, k: int) -> str:
strs = list(s) # 字符串不支持原地反转
i = 0
while i < len(strs):
r = min(i + k, len(strs))
strs[i:r] = strs[i:r][::-1] # 反转前K个字符
i += 2*k
return "".join(strs)
卡码网:54.替换数字, 介绍re包的形式,当然也可以导str的方法和包来处理。
import re
s = input()
strs = list(s)
for idx,ch in enumerate(strs):
if re.match('\d',ch):
strs[idx] = 'number'
print(''.join(strs))
151: 一行代码解法,目测全网最简洁
class Solution:
def reverseWords(self, s: str) -> str:
return ' '.join(s.strip().split()[::-1])
卡码网:55.右旋转字符串
k = int(input())
s = input()
strs = list(s)
n = len(s)
print(s[n-k:] + s[:n-k])
复盘思路
https://programmercarl.com/0344.%E5%8F%8D%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2.html
https://programmercarl.com/0541.%E5%8F%8D%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2II.html
https://programmercarl.com/kama54.%E6%9B%BF%E6%8D%A2%E6%95%B0%E5%AD%97.html
https://programmercarl.com/kama55.%E5%8F%B3%E6%97%8B%E5%AD%97%E7%AC%A6%E4%B8%B2.html
重点难点
今天题目偏简单,除了541的逻辑有一些难直观的想出来。
今日收获
字符串的处理,主要几个大类:
1、字符的提取和转换
2、字符之间的位置转换(双指针、切片为主)
3、字符模式的匹配和处理
4、字符转其他类型、模拟计算(较少)