代码随想录第八天 | 344 反转字符串 541 反转字符串Ⅱ 剑指offer05替换空格 151 翻转字符串里的单词 剑指offer58-Ⅱ 左旋转字符串

344 反转字符串

题目链接
功能不难实现,但是要求原地修改数组
首先想到list[::-1]直接反序,但是为什么无法修改原数组?是因为此方法使用了额外空间吗?可能是因为我修改了s变量的地址?然后执行时仍然调用了原地址下的数据,因此我必须要在原地址上修改数据,这怎么做到?

class Solution:
    def reverseString(self, s: List[str]) -> None:
        """
        Do not return anything, modify s in-place instead.
        """
        length = len(s)
        for i in range(length-1,-1,-1):
            s.append(s[i])
        for i in range(length):
            s.pop(0)
        

重写了一个,结果居然最后一组输入超时。。重新思考一下有没有复杂度更低的写法
可以直接把第一个和最后一个交换位置

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

ok通过
看了解答之后发现是可以使用切片的,但是必须使用s[:],不能直接对s变量赋值,因为这样赋值会创建一个新变量,而s[:]则不会,通过在jupyter notebook使用id()取变量地址可以验证这一点

541 反转字符串Ⅱ

题目链接

class Solution:
    def reverseStr(self, s: str, k: int) -> str:
        s = list(s)
        for i in range(0,len(s),2*k):
            for j in range(i,min(i+(k//2),len(s))):
                if len(s) - i < k:
                    s[i:] = s[i:][::-1]
                    break
                else:
                    temp = s[j]
                    s[j] = s[2*i+k-j-1]
                    s[2*i+k-j-1] = temp
        return ''.join(s)

debug了两次才通过
首先不太熟悉字符串的操作函数,str.join(iterable)操作一个可迭代对象转换为字符串,str为连接字符
其次对题意考虑有误,剩余字符大于k小于2k的情况固然不用管,直接正常交换跳出即可,但小于k时需要单独考虑,否则会列表访问越界
看解答后发现自己犯傻了,可以直接用切片反序的,不用自己调换顺序,被前面那题限制思路了

class Solution:
    def reverseStr(self, s: str, k: int) -> str:
        s = list(s)
        for i in range(0,len(s),2*k):
            if len(s) - i < k:
                s[i:] = s[i:][::-1]
                break
            else:
                s[i:min(i+k,len(s))] = s[i:min(i+k,len(s))][::-1]
        return ''.join(s)

并不需要第二个循环,直接切片反序即可

剑指offer05 替换空格

题目链接

class Solution:
    def replaceSpace(self, s: str) -> str:
        s = list(s)
        for i in range(len(s)):
            if s[i] == ' ':
                s[i] = '%20'
        return ''.join(s)

简单题,不过我这种遍历替换的方法复杂度这么高吗?只击败了11%的提交者
看一下解答,python的方法很多
首先可以使用双指针法,先扩展空间,然后从后往前移动,遇到空格则填充要求的字符
还可以使用str.split()函数,参数为字符,表示以某个字符为界分割字符串,会删掉参数字符,然后利用str.join函数再以20%连接
还可以直接使用str.replace(a,b)以b替换字符串中的a

151 翻转字符串里的单词

题目链接
这题看似简单,实际上很容易通不过,debug了三次才过。。都是因为多余的空格字符

class Solution:
    def reverseWords(self, s: str) -> str:
        s = s.split(' ')
        while '' in s:
            s.remove('')
        s = s[::-1]
        return ' '.join(s)

关键是要转为列表中去除列表中的空字符元素,不过虽然这样能过,但是时间较长。
注意:split函数默认参数即为空格,在不填入参数使用默认参数时,会自动忽略多个连续的空格,全部删掉而不分割,而如果填入参数’ ‘,则会把两个连续空格之间的空字符都分离出来!!

剑指offer58-Ⅱ 左旋转字符串

题目链接

class Solution:
    def reverseLeftWords(self, s: str, n: int) -> str:
        s = list(s)
        for i in range(n):
            s.append(s[0])
            s.pop(0)
        return ''.join(s)

通过了,但是耗时很长。。
看了解答,还是切片法最好用,就一行还快
学习一下reversed函数,参数是一个sequence,包括列表,元组,字符换,range(n)区间等,返回一个逆序序列的迭代器

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值