1. 反转字符串(leetcode 344)
这题非常的简单直观,我们用双指针就可以轻易写出。
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:
s[left], s[right] = s[right], s[left]
left += 1
right -= 1
return s
切片法:
class Solution:
def reverseString(self, s: List[str]) -> None:
"""
Do not return anything, modify s in-place instead.
"""
s[:] = s[::-1]
遍历法:
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]
2. 反转字符串 2(leetcode 541)
这题我们也是向上一题一样用双指针法,只是让遍历的频率变得2k一次,逻辑都是一样的。
这题虽然有两个loop,但要记得时间复杂度是O(n)。
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
s = list(s)
if len(s) < k:
return "".join(reverse_substring(s)) #处理s长度小于k的情况
for i in range(0,len(s), 2*k): #s长度大于k的情况
s[i:i+k] = reverse_substring(s[i:i+k])
return ''.join(s)
3. 替换数字(KamaCoder 54)
给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。 例如,对于输入字符串 "a1b2c3",函数应该将其转换为 "anumberbnumbercnumber"。
输入描述
输入一个字符串 s,s 仅包含小写字母和数字字符。
输出描述
打印一个新的字符串,其中每个数字字符都被替换为了number
输入示例
a1b2c3
输出示例
anumberbnumbercnumber
由于我们python有.isdigit()这个非常方便的字符串内置函数,因此我们可以直接用。同时我们也可以用ASCIL的方法做。要记住由于字符串是immutable的,我们要先把他变成list
class Solution:
def change(self, s):
lst = list(s)
# Python里面的string也是不可改的,所以也是需要额外空间的。空间复杂度:O(n)。
for i in range(len(lst)):
if lst[i].isdigit():
lst[i] = "number"
return ''.join(lst)
4. 反转字符串里的单词(leetcode 151)
这题用python来写也比较简单,因为split函数可以直接帮我们消除多余的空格,得到只有单词的数组。
class Solution:
def reverseWords(self, s: str) -> str:
# 将字符串拆分为单词,即转换成列表类型
words = s.split()
# 反转单词
left, right = 0, len(words) - 1
while left < right:
words[left], words[right] = words[right], words[left]
left += 1
right -= 1
# 将列表转换成字符串
return " ".join(words)
5. 右旋转字符串(KarmaCoder 55)
这题由于python无法更改字符串,所以我们只能申请额外空间来做。
#Python:
#获取输入的数字k和字符串
k = int(input())
s = input()
#通过切片反转第一段和第二段字符串
#注意:python中字符串是不可变的,所以也需要额外空间
s = s[len(s)-k:] + s[:len(s)-k]
print(s)
今天的题目分析较为简单,是因为由于python的字符串不可变,同时python也有很多好用的built in function能帮我们很好的处理字符串和数组,因此我们的很多思路和方法无法达到卡哥的要求,对字符串进行那么细致的操作。关于其它语言的写法以及思路请详见代码随想录。