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

344.反转字符串

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

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

541. 反转字符串II

每2*k个字符进行遍历

python 复制代码
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

卡码网:54.替换数字

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

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

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

python 复制代码
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)

151.翻转字符串里的单词

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

python 复制代码
class Solution:
    def reverseWords(self, s: str) -> str:
        s = s.strip().split()
        s.reverse()
        return " ".join(s)

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

python 复制代码
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

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

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

python 复制代码
k = int(input())
s = input()

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

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

python 复制代码
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))
相关推荐
闻缺陷则喜何志丹1 分钟前
【BFS】 P10864 [HBCPC2024] Genshin Impact Startup Forbidden II|普及+
c++·算法·宽度优先·洛谷
MicroTech202521 分钟前
微算法科技(NASDAQ: MLGO)探索Grover量子搜索算法,利用量子叠加和干涉原理,实现在无序数据库中快速定位目标信息的效果。
数据库·科技·算法
今天背单词了吗9801 小时前
算法学习笔记:8.Bellman-Ford 算法——从原理到实战,涵盖 LeetCode 与考研 408 例题
java·开发语言·后端·算法·最短路径问题
手握风云-1 小时前
优选算法的链脉之韵:链表专题
数据结构·算法·链表
Coding小公仔1 小时前
LeetCode 151. 反转字符串中的单词
开发语言·c++·算法
稳兽龙1 小时前
P1098 [NOIP 2007 提高组] 字符串的展开
c++·算法·模拟
G.E.N.1 小时前
开源!RAG竞技场(2):标准RAG算法
大数据·人工智能·深度学习·神经网络·算法·llm·rag
写个博客1 小时前
暑假算法日记第三天
算法
✿ ༺ ོIT技术༻2 小时前
剑指offer第2版:动态规划+记忆化搜索
算法·动态规划·记忆化搜索
oioihoii2 小时前
C++11标准库算法:深入理解std::none_of
java·c++·算法