代码随想录算法训练营第八天 | 344.反转字符串 541.反转字符串Ⅱ 卡码网 54.替换数字

LeetCode 344.反转字符串:

文章链接
题目链接:344.反转字符串

看到题目后的思路:

  1. 利用待交换字符的位置序号之间的关系
    要求是原地反转字符串,遍历字符串的前半部分,每个字符都与后半部分对应位置交换位置。
    i 与 len - 1 - i
class Solution(object):
    def reverseString(self, s):
        len_s = len(s)
        for i in range(len_s//2):
            s[i], s[len_s - 1 - i] = s[len_s - 1 - i], s[i]
  1. 双指针
    left指针和right指针分别指向字符串的头部和尾部,不断交换指针所指向的值。
class Solution(object):
    def reverseString(self, s):
        left, right = 0, len(s) - 1
        while left < right:
            s[left], s[right] = s[right], s[left]
            left += 1
            right -= 1

LeetCode 541.反转字符串Ⅱ:

文章链接
题目链接:541.反转字符串Ⅱ

看到题目后的想法

  1. 转换为列表后进行处理
    注意到输入为字符串,因此处理时要先将其转换为列表。且遍历列表的步长为 2 * k
class Solution(object):
    def reverseStr(self, s, k):
        """
        :type s: str
        :type k: int
        :rtype: str
        """
        def reverse_partS(text):
            left, right = 0, len(text) - 1
            while left < right:
                text[left], text[right] = text[right], text[left]
                left += 1
                right -= 1
            return text
        res = list(s)
        for i in range(0, len(res), 2 * k):
            res[i:i + k] = reverse_partS(res[i:i + k])  # 当i + k > res时,返回的是列表最后一个元素
        return ''.join(res)
  1. 每次反转时都重新赋值整个字符串
    (还可以再研究一下)
class Solution(object):
    def reverseStr(self, s, k):
        p, len_s = 0, len(s)
        while p < len_s:
            p2 = p + k
            s = s[:p] + s[p:p2][::-1] + s[p2:]
            p = p + 2*k
        return s

实现过程中遇到的困难:

惯性思维步长为1了,在这道题目中其实步长为2 * k更合适


卡码网 54.替换数字:

文章链接
题目链接:替换数字

看到题目后的想法:

先扩充字符串数组,然后使用双指针从后向前填充该数组,newIndex指向新数组的结尾,oldIndex指向旧数组的结尾。
在扩充后的数组中从后向前填充的优点:① 不需要使用额外的辅助空间 ② 降低算法复杂度为O(n);如果从前向后填充的话,每次替换number时,都需要将后面的元素整体后移,时间复杂度为O(n^2)
但是python中的String不能扩充,因此还是需要使用额外的辅助空间。

class Solution:
    def replaceNumber(self, s):
        res = list(s)
        number = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
        for i in range(len(s)):
        	# 判断是否为数字
            #if res[i].isdigit():
            #if ord("0") <= ord(res[i]) <= ord("9"):
            if res[i] in number:
                res[i] = "number"
        return ''.join(res)
solution = Solution()
s = input()
result = solution.replaceNumber(s)
print(result)

实现过程中遇到的困难:

需要记住有几种判断字符是否为数字的方法


学习收获:

① python中的String字符串不能对其中的单个进行替换,如果需要替换的话,要么将其转换为列表替换后再转换为字符串;要么将不变的部分和替换的部分拼接为新的字符串后全部替换。
② 双指针在字符串中的使用。
③ 几种判断字符是否为数字的方法:ord、列表、isdigit()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值