算法与数据结构力扣刷题第8天

344.反转字符串

        编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。

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

        这道题需要绕一个弯,这个是我学python如此长的时间,一直绕不出来的一个弯

        s[first],s[back]=s[back],s[first],此句话表示的是数组中两个数的同时交换,我以前一直以为不能这样做,做了此道题之后,我才知道可以这样操作。

541. 反转字符串II

        给定一个字符串 s 和一个整数 k,从字符串开头算起, 每计数至 2k 个字符,就反转这 2k 个字符中的前 k 个字符。

        如果剩余字符少于 k 个,则将剩余字符全部反转。

        如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

        这道题我踩的有坑。

        运行代码:

class Solution:
    def reverseStr(self, s: str, k: int) -> str:

        def hanshu(ff):
            left = 0
            right = len(ff)-1
            dd = ff
            while left<right:
                dd[left],dd[right]=dd[right],dd[left]
                left+=1
                right-=1
            return dd

        fff=list(s)
        for i in range(0,len(s),2*k):
            fff[i:i+k]=hanshu(fff[i:i+k])
        return ''.join(fff)

        这道题题目很复杂,逻辑很简单。

        (1)【344.反转字符串】的基础上,多加了一个for循环。

        (2)主要考察的是对 for i in range(0,len(s),2*k)中间隔2*k的用法。

        (3)题目中说的如果剩余字符少于 k 个,则将剩余字符全部反转。如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。”  就是表达一个意思:小于k的要反转,用一层for循环就解决。

        踩坑1:

                for i in range(0,len(s),2*k)循环不会用,没想到这一思路。

        踩坑2:

                我当时做的时候:

         fff全部字符传入函数中,全部反转。执行fff[i:i+k]=rrr后,会替换k=2的两个字符。这是我debug后才明白的。(下第二张图展示)

        

 题目:剑指Offer 05.替换空格

        请实现一个函数,把字符串 s 中的每个空格替换成"%20"。

        示例 1: 输入:s = "We are happy."
        输出:"We%20are%20happy."

        自己写的运行代码:

class Solution:
    def replaceSpace(self, s: str) -> str:
        left_len=len(s)
        counter=s.count(' ')
        fff = list(s)
        fff.extend([" "]*counter*2)


        right=len(fff)-1
        left=left_len-1

        while left>=0:
            if fff[left]!=' ':
                fff[right]=fff[left]
                right-=1
            elif fff[left]==" ":
                fff[right]='0'
                right-=1
                fff[right]='2'
                right-=1
                fff[right]='%'
                right-=1
            left -= 1
        return ''.join(fff)

        此道题思路也比较简单:

        (1)将字符串转为列表

        (2)运用列表extend函数,对列表扩展,最终需要长度

        (3)建立while循环语句,两个指针慢慢挪;

        (4)最近使用''.join(fff)语句列表转为字符串。(这里我当时踩了一个坑,在''中间,加了一个空格,使得输出出现了问题,如下图所示) 

151.翻转字符串里的单词   

        给定一个字符串,逐个翻转字符串中的每个单词。

        示例 1:
        输入: "the sky is blue"
        输出: "blue is sky the"

        我当时看错题目:写了下面代码(略):

class Solution:
    def reverseWords(self, s: str) -> str:
        def reverse_e(ff):
            left=0
            dd=len(ff)
            right=len(ff)-1
            for i in range(dd//2):
                ff[left],ff[right]=ff[right],ff[left]
                left+=1
                right-=1
            return ff
        ss_list=list(s)
        ddf=0
        for i in range(len(ss_list)):
            if ss_list[i] ==" ":
                EE=ss_list[ddf:i]
                FF=reverse_e(ss_list[ddf:i])

                ss_list[ddf:i]=reverse_e(ss_list[ddf:i])
                ddf = i+1


        return ''.join(ss_list)

rr=Solution()

s = "We are happy."
# k = 2
# rr.reverseStr(s,k)
rr.reverseWords(s)
print(rr.reverseWords(s))  # Output: "bacdfeg"

 调包的方法:

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

我自己写的调包的方法(太拉跨):

class Solution:
    def reverseWords(self, s: str) -> str:
        ff=s.split()
        s_len=len(ff)
        left=0
        right=s_len-1
        yyy=ff[right]
        for i in range(s_len//2):
            ff[left],ff[right]=ff[right],ff[left]
            left+=1
            right-=1



        return " ".join(ff)

        踩坑1:

        我最开始用的ff=s.split(' '),用空格分隔,如果给的字符串中有空格,最后会提取到'',并且提取到的''数量会比空格数量少1个(见下图2)。很难去除,我最后也没搞定这个问题。

        

        (时间太少,不导包方法二刷)

剑指Offer58-II.左旋转字符串

        def reverse(list_n,left,right):
            while left<right:
                list_n[left],list_n[right]=list_n[right],list_n[left]
                left+=1
                right-=1
        res=list(s)
        end=len(res)-1
        reverse(res,0,n-1)
        reverse(res,n,end)
        reverse(res, 0, end)

        return ''.join(res)

       导函数解决方法如下:

class Solution:
    def reverseLeftWords(self, s: str, n: int) -> str:
        s = list(s)
        s[0:n] = list(reversed(s[0:n]))
        s[n:] = list(reversed(s[n:]))
        s.reverse()

        return "".join(s)

         踩坑1:

                reverse(list_n,left,right),left和right需要传参,当时没想到。

class Solution:
    def reverseLeftWords(self, s: str, n: int) -> str:
        # def reverse(list_n,left,right):
        #     while left<right:
        #         list_n[left],list_n[right]=list_n[right],list_n[left]
        #         left+=1
        #         right-=1
        # res=list(s)
        # end=len(res)-1
        # reverse(res,0,n-1)
        # reverse(res,n,end)
        # reverse(res, 0, end)
        #
        # return ''.join(res)
        tt=s[n:]

        return s[n:]+s[0:n]

        踩坑1:

                当时没想到字符串可以做切片。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值