【代码随想录——day_08】

344. 反转字符串

法一:反转之后再逐个修改字符串s
法二:数学归纳法,可以让第一个和最后一个两两交换位置,第二个和倒数第2个两两交换

class Solution:
    def reverseString(self, s: List[str]) -> None:
        """
        Do not return anything, modify s in-place instead.
        """
        # 法一:
        # t = s[::-1]
        # for i in range(len(s)):
        #     s[i] = t[i]
        # return s
        # 法二:
        mid = len(s) // 2
        for i in range(mid):
            s[i], s[len(s)-1-i] = s[len(s)-1-i], s[i]
        return s

541. 反转字符串 II

第一想法:就简单模拟,具体思路见代码注释

class Solution:
    def reverseStr(self, s: str, k: int) -> str:
    	# 记录结果
        t = ""
        # 遍历字符串s,每次步长为2k
        for i in range(0, len(s), 2 * k):
        	# 两种切片方法取得前k(需翻转)和后k个(无需翻转)
            temp = s[i:i+2*k]
            temp_1 = temp[:k]
            temp_2 = temp[k:]
            # temp_1 = s[i:i+k]
            # temp_2 = s[i+k:i+2*k]
            # 翻转字符串
            if len(temp_1) <= k:
                temp_1= temp_1[::-1]
            # 拼接结果
            t += temp_1+temp_2
        return t

剑指 Offer 05. 替换空格

第一想法:用replace

class Solution:
    def replaceSpace(self, s: str) -> str:
    	# 法一:
    	# return s.replace(' ','%20')
    	# 法二:
        n = len(s)
        for e,i in enumerate(s[::-1]):
            print(i,e)
            if i == " ":
                s = s[:n - (e + 1)] + "%20" + s[n-e:]
                print(f"n-e+1:{n-(e+1)}/{n-e}")
            print("")
        return s

学习后思路总结:

  1. 首先扩充数组到每个空格替换成"%20"之后的大小
  2. 然后从后向前使用双指针法替换空格,i指向新长度的末尾,j指向旧长度的末尾
  3. i指向空格时,就让j填充% 20,否则就填充i所指向的元素,知道i指向0号元素
class Solution:
    def replaceSpace(self, s: str) -> str:
        cnt = s.count(' ')
        res = list(s)
        res.extend([' '] * 2 * cnt)
        l, r = len(s)-1, len(res)-1
        # 如果,写成while l!=0:会报错, 针对空字符情况“”
        while l >= 0:
            if s[l] == ' ':
                res[r-2:r+1] = '%20'
                r -= 3
            else:
                res[r] = s[l]
                r -= 1
            l -= 1
        return ''.join(res)

151.翻转字符串里的单词

自己的思路:模拟,

  1. 首先按照空格正序遍历,将每个单词存放到列表中,
  2. 反转列表
  3. 将列表中的单词每个+空格
class Solution:
    def reverseWords(self, s: str) -> str:
        t = list()
        temp = ''
        for id,i in enumerate(s):
            if i == ' ':
                if temp != '':
                    t.append(temp)
                temp = ""
            else:
                temp += i
            # 在字符串的末尾也要添加一次,s = "a good   example"否则最后一个example无法完整取到
            if id == len(s) - 1:
                if temp != '':
                    t.append(temp)
        t.reverse()
        # 法一:模拟
        # ans = ""
        # for i in range(len(t)):
        #     ans += t[i] + ' '
        # return ans[:-1]
        # 法二:join
        res = " ".join(t)
        return res

拓展

剑指 Offer 58 - II. 左旋转字符串

第一想法:切片

class Solution:
    def reverseLeftWords(self, s: str, n: int) -> str:
        return s[n:]+s[:n]

难点:局部翻转和整体翻转

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值