LeetCode 344. 反转字符串
题目:https://leetcode.cn/problems/reverse-string/description/
解析:https://programmercarl.com/0344.%E5%8F%8D%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE
看到原地就想到双指针。
class Solution:
def reverseString(self, s: List[str]) -> None:
"""
Do not return anything, modify s in-place instead.
"""
left, right = 0, len(s)-1
while left < right:
s[left], s[right] = s[right], s[left]
left += 1
right -= 1
其他:
- 该方法已经不需要判断奇偶数,经测试后时间空间复杂度比用 for i in range(len(s)//2)更低
- 因为while每次循环需要进行条件判断,而range函数不需要,直接生成数字,因此时间复杂度更低。推荐使用range
class Solution:
def reverseString(self, s: List[str]) -> None:
"""
Do not return anything, modify s in-place instead.
"""
n = len(s)
for i in range(n // 2):
s[i], s[n-i-1] = s[n-i-1], s[i]
LeetCode 541. 反转字符串II
题目:https://leetcode.cn/problems/reverse-string-ii/
解析:https://programmercarl.com/0541.%E5%8F%8D%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2II.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE
注1:如何切片?
range(0, (2*k)*n, 2*k)
还是range(0, (2*k+1)*n, 2*k)
?0
是起点,(2*k)*n
是长度,不需要+1elf.reverse(s[i:i+k])
还是elf.reverse(s[i:i+k+1])
?i
是起点,k
是长度,不需要+1
注2:字符串时不可变的,在处理字符串时不要直接修改其值,即,不可以s[0]='l'
注3: 最终list的形式是['a', 'b', 'c', 'd', 'e', 'f', 'g']
,不能直接str(s)
,而是应该''.join(s)
.
class Solution:
def reverse(self, s):
left, right = 0, len(s)-1
while left < right:
s[left], s[right] = s[right], s[left]
left += 1
right -= 1
return s
def reverseStr(self, s: str, k: int) -> str:
s = list(s)
l = len(s)
n = l//(2*k) + 1
for i in range(0, (2*k)*n, 2*k):
s[i:i+k] = self.reverse(s[i:i+k])
return ''.join(s)
卡码网 54. 替换数字
题目:https://kamacoder.com/problempage.php?pid=1064
链接:https://programmercarl.com/kama54.%E6%9B%BF%E6%8D%A2%E6%95%B0%E5%AD%97.html
ACM模式
卡码网使用acm模式
【来自ChatGPT】
在编程竞赛中,ACM 模式通常指的是通过标准输入读取数据。在这种情况下,我们通常会使用 Python 的 input()
函数来读取输入,或者在一些更复杂的竞赛平台上,可能需要使用 sys.stdin.read()
来读取多行输入。
在 ACM 模式中,您可能会遇到如下输入格式:
例如,输入数据如下:
2
a1b2c3
d4e5f6
这里的第一行表示接下来将有多少行数据。接下来的每一行都是我们需要处理的字符串。
示例代码:从标准输入读取数据
以下是一个示例代码,展示如何在 ACM 模式下读取数据并处理它:
import sys
# 从标准输入读取第一行,表示接下来有多少行数据
n = int(input().strip())
for _ in range(n):
input_str = input().strip() # 读取每一行输入
letters = []
numbers = []
for char in input_str:
if char.isalpha(): # 如果是字母
letters.append(char)
elif char.isdigit(): # 如果是数字
numbers.append(char)
# 将字符列表转换为字符串
letters_str = ''.join(letters)
numbers_str = ''.join(numbers)
print("Letters:", letters_str) # 输出字母部分
print("Numbers:", numbers_str) # 输出数字部分
示例输入输出
假设输入为:
2
a1b2c3
d4e5f6
程序会输出:
Letters: abc
Numbers: 123
Letters: def
Numbers: 456
其他读取方式
如果输入数据非常多,或者您希望一次性读取所有数据,可以使用 sys.stdin.read()
方法:
import sys
# 读取所有输入
input_data = sys.stdin.read().strip().splitlines()
n = int(input_data[0]) # 第一行是行数
for i in range(1, n + 1):
input_str = input_data[i] # 读取每一行输入
# 处理逻辑与上面相同
对于input_data = sys.stdin.read().strip().splitlines()
sys.stdin.read()
:读入str
sys.stdin.read().strip()
:去除两端空格
sys.stdin.read().strip().splitlines()
:按行分开
解题
import sys
s = sys.stdin.read().strip()#只有一行
res = ""
for i in s:
if i.isalpha():
res += i
else:
res += 'number'
print(res)
原解析里面用的是c++,提供了不额外占用空间的办法,但python中字符串是不可变的,不能采用这种方法。