• 代码随想录算法训练营day8 | 344.反转字符串、541. 反转字符串II、卡码网:54.替换数字、151.翻转字符串里的单词、卡码网:55.右旋转字符串


    344.反转字符串

    Python的字符串是不可变的,不能原地修改,因此题目给的是列表,在列表中原地修改

    1. class Solution:
    2. def reverseString(self, s: List[str]) -> None:
    3. """
    4. Do not return anything, modify s in-place instead.
    5. """
    6. left = 0
    7. right = len(s) - 1
    8. while left < right:
    9. s[left], s[right] = s[right], s[left]
    10. left += 1
    11. right -= 1

    541. 反转字符串II

    每2*k个字符进行遍历

    1. class Solution:
    2. def reverseStr(self, s: str, k: int) -> str:
    3. s = list(s)
    4. for i in range(0, len(s), 2*k):
    5. if i+k <= len(s):
    6. self.reverse(s, i, i+k-1)
    7. else:
    8. self.reverse(s, i, len(s)-1)
    9. return "".join(s)
    10. def reverse(self, s, left, right):
    11. while left < right:
    12. s[left], s[right] = s[right], s[left]
    13. left += 1
    14. right -= 1

    卡码网:54.替换数字

    将数字替换为number,在C++中字符串是可变的,可以先统计字符串中数字的个数,然后重新开辟空间,从结尾处遍历字符串,遇见数字就填充number

    而在python中,字符串是不可变的,想这么做的话可以将字符串转化为list,申请相应的空间,从后向前逐个填充字符。

    实际使用Python完成时,转化为list后,不需要申请空间和从后向前填充,而是遇见数字后直接替换为number

    1. class Solution:
    2. def change(self, s):
    3. lst = list(s) # Python里面的string也是不可改的,所以也是需要额外空间的。空间复杂度:O(n)。
    4. for i in range(len(lst)):
    5. if lst[i].isdigit():
    6. lst[i] = "number"
    7. return ''.join(lst)

    151.翻转字符串里的单词

    按照Python的做法,直接split,然后反转单词即可

    1. class Solution:
    2. def reverseWords(self, s: str) -> str:
    3. s = s.strip().split()
    4. s.reverse()
    5. return " ".join(s)

    本着练习的态度:先移除多余空格(使用双指针),再反转整个字符串,最后反转单个单词。有一定难度

    1. class Solution:
    2. def reverseWords(self, s: str) -> str:
    3. # 移除空格
    4. s = self.removeExtraSpace(s)
    5. # 反转字符串
    6. self.reverse(s, 0, len(s)-1)
    7. # 反转单词
    8. left = 0
    9. for i in range(len(s)+1):
    10. if i == len(s) or s[i] == " ":
    11. self.reverse(s, left, i-1)
    12. left = i + 1
    13. return "".join(s)
    14. def removeExtraSpace(self, s):
    15. s = list(s)
    16. slow = 0
    17. i = 0
    18. while i < len(s):
    19. if s[i] != " ":
    20. if slow != 0:
    21. s[slow] = " "
    22. slow += 1
    23. while i < len(s) and s[i] != " ":
    24. s[slow] = s[i]
    25. slow += 1
    26. i += 1
    27. i += 1
    28. return s[:slow]
    29. def reverse(self, s, left, right):
    30. while left < right:
    31. s[left], s[right] = s[right], s[left]
    32. left += 1
    33. right -= 1

    卡码网:55.右旋转字符串

    直接将后k个字符与前面的字符拼接,这种方式会用到额外的空间

    1. k = int(input())
    2. s = input()
    3. #通过切片反转第一段和第二段字符串
    4. #注意:python中字符串是不可变的,所以也需要额外空间
    5. s = s[len(s)-k:] + s[:len(s)-k]
    6. print(s)

    先反转字符串,然后反转后的字符串前k个反转,剩下的字符串也反转,即为最终答案

    1. k = int(input())
    2. s = input()
    3. s = list(s)
    4. s.reverse()
    5. a = s[:k]
    6. b = s[k:len(s)]
    7. a.reverse()
    8. b.reverse()
    9. print("".join(a+b))

  • 相关阅读:
    includes问题
    win系统环境搭建(六)——Windows安装nginx
    02 Java虚拟机的结构
    Java中实体与Map的相互转换
    在linux上把配置命令写出来
    Spark 优化 (二) --------- Spark 数据倾斜
    微服务项目:尚融宝(38)(核心业务流程:申请借款额度(2))
    Java 入门:装箱与拆箱
    鉴源论坛 · 观模丨浅谈随机测试
    硬件开发笔记(二十一):外部搜索不到的元器件封装可尝试使用AD21软件的“ManufacturerPart Search”功能
  • 原文地址:https://blog.csdn.net/sunflowers11/article/details/138157659