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:
- s[left], s[right] = s[right], s[left]
- left += 1
- right -= 1
每2*k个字符进行遍历
- class Solution:
- def reverseStr(self, s: str, k: int) -> str:
- s = list(s)
- for i in range(0, len(s), 2*k):
- if i+k <= len(s):
- self.reverse(s, i, i+k-1)
- else:
- self.reverse(s, i, len(s)-1)
- return "".join(s)
-
- def reverse(self, s, left, right):
- while left < right:
- s[left], s[right] = s[right], s[left]
- left += 1
- right -= 1
将数字替换为number,在C++中字符串是可变的,可以先统计字符串中数字的个数,然后重新开辟空间,从结尾处遍历字符串,遇见数字就填充number
而在python中,字符串是不可变的,想这么做的话可以将字符串转化为list,申请相应的空间,从后向前逐个填充字符。
实际使用Python完成时,转化为list后,不需要申请空间和从后向前填充,而是遇见数字后直接替换为number
- 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)
按照Python的做法,直接split,然后反转单词即可
- class Solution:
- def reverseWords(self, s: str) -> str:
- s = s.strip().split()
- s.reverse()
- return " ".join(s)
本着练习的态度:先移除多余空格(使用双指针),再反转整个字符串,最后反转单个单词。有一定难度
- class Solution:
- def reverseWords(self, s: str) -> str:
- # 移除空格
- s = self.removeExtraSpace(s)
- # 反转字符串
- self.reverse(s, 0, len(s)-1)
- # 反转单词
- left = 0
- for i in range(len(s)+1):
- if i == len(s) or s[i] == " ":
- self.reverse(s, left, i-1)
- left = i + 1
- return "".join(s)
-
- def removeExtraSpace(self, s):
- s = list(s)
- slow = 0
- i = 0
- while i < len(s):
- if s[i] != " ":
- if slow != 0:
- s[slow] = " "
- slow += 1
- while i < len(s) and s[i] != " ":
- s[slow] = s[i]
- slow += 1
- i += 1
- i += 1
- return s[:slow]
-
- def reverse(self, s, left, right):
- while left < right:
- s[left], s[right] = s[right], s[left]
- left += 1
- right -= 1
直接将后k个字符与前面的字符拼接,这种方式会用到额外的空间
- k = int(input())
- s = input()
-
- #通过切片反转第一段和第二段字符串
- #注意:python中字符串是不可变的,所以也需要额外空间
- s = s[len(s)-k:] + s[:len(s)-k]
- print(s)
先反转字符串,然后反转后的字符串前k个反转,剩下的字符串也反转,即为最终答案
- k = int(input())
- s = input()
-
- s = list(s)
- s.reverse()
- a = s[:k]
- b = s[k:len(s)]
- a.reverse()
- b.reverse()
- print("".join(a+b))