前言
今天是算法训练营的第八天,可以明显发现坚持人数在开营一周之后明显下降了很多。
今天的题目相对来说比较轻松简单,第一道一个反转字符串用双指针轻松搞定,第二道是在前一道基础上增加了一些规则需要对规则思考清楚,第三道题如果单开一个字符串来打印还是比较简单的。
344.反转字符串
题目链接:344. 反转字符串
题目描述:
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组
s的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
思路
这道题还是比较简单的,和之前反转数组的做法类似,使用双指针从两段向内收进行替换,除了双指针也可以选择直接调用 Python 中自带的库函数,但由于是打基础,所以还是老实写双指针。
实现写法
class Solution:
def reverseString(self, s: List[str]) -> None:
"""
Do not return anything, modify s in-place instead.
"""
left = 0
right = len(s) - 1
while left <= right:
temp = s[left]
s[left] = s[right]
s[right] = temp
left += 1
right -= 1
541.反转字符串II
题目链接:541. 反转字符串 II
题目描述:
给定一个字符串
s和一个整数k,从字符串开头算起,每计数至2k个字符,就反转这2k字符中的前k个字符。
- 如果剩余字符少于
k个,则将剩余字符全部反转。- 如果剩余字符小于
2k但大于或等于k个,则反转前k个字符,其余字符保持原样。
思路
这道题实际上只是反转字符串的基础上套了一个规则场景,重要的是理解规则,在刚看到这道题时,我的想法是三个 if 模拟三条规则,但实现起来存在大量的冗余,看完题解后大悟实际上使用切片就可以把这三个规则全都囊括。
实现写法
class Solution:
def reverseStr(self, s: str, k: int) -> str:
def reverse_substring(text):
left, right = 0, len(text) - 1
while left < right:
text[left], text[right] = text[right], text[left]
left += 1
right -= 1
return text
n = len(s)
res = list(s)
for i in range(0, len(s) - 1, 2 * k):
res[i: i + k] = reverse_substring(res[i: i + k])
return "".join(res)
卡码网:54.替换数字
题目链接:54.替换数字(第八期模拟笔试)
题目描述:
给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。 例如,对于输入字符串 “a1b2c3″,函数应该将其转换为 “anumberbnumbercnumber”。
思路
又是不熟悉的ACM 输入输出模式,不过由于这次的题目比较简单所以实现起来还是比较容易的,核心思想就是读字符串中的每一个字符进行是否是数字的判断,这边还可以使用到isdigit()函数,如果判断到就在输出里加上number,如果不是就输出字符本身
实现写法
str1 = input()
ans = ""
for ss in str1:
if ord("0") <= ord(ss) <= ord("9"):
ans += "number"
else:
ans += ss
print(ans)
总结
今天的题量相对来说比较小,也比较简单,可能由于python的便利性过于强大导致题目实际上实现起来没有特别难以理解。