[leetcode 541]反轉字符串

1.問題描述

給定一個字符串和一個整數 k,你需要對從字符串開頭算起的每個 2k 個字符的前k個字符進行反轉。如果剩餘少於 k 個字符,則將剩餘的所有全部反轉。如果有小於 2k 但大於或等於 k 個字符,則反轉前 k 個字符,並將剩餘的字符保持原樣。

示例:

輸入: s = "abcdefg", k = 2
輸出: "bacdfeg"
要求:

該字符串只包含小寫的英文字母。
給定字符串的長度和 k 在[1, 10000]範圍內。

2.思路介紹

  • 首先知道有多少個2k部分,其次知道剩下不夠2k的部分的長度,一個整除操作一個取餘操作。
  • 知道每個2k部分前k個的座標,進行反轉操作。
  • 對不足的部分,判斷是題目中哪種清楚,進行對應操作。
  • 有一個問題:使用str.replace(str部分,new)的時候,這個操作是失效的。我不知道原因。最後使用s[::-1]進行反轉操作。還有s[n:-1]表示的是取該位置n的一個數,而不是該位置之後的所有數。應該是s[n::] 

3.代碼:

class Solution(object):
    def reverseStr(self, s, k):
        """
        :type s: str
        :type k: int
        :rtype: str
        """
        S=""
        s_len=len(s)
        ans1=s_len%(2*k)
       # print(ans1)
        ans2=s_len//(2*k)
       # print(ans2)
        for i in range(0,ans2):
            w=s[2*k*i:2*k*i+k]
        #    print(w)
            n=w[::-1]
         #   print(n)
            #s.replace(s[2*k*i:2*k*i+k],n)
           # s[2*k*i:2*k*i+k]=n
           # print(s)
            S=S+n
            S=S+s[2*k*i+k:2*k*i+2*k]
        #print(S)
        if ans1>= k and ans1<2*k:
                w=s[2*k*ans2:2*k*ans2+k]
         #       print(w)
                n=w[::-1]
                #s.replace(s[2*k*ans2:2*k*ans2+k],n)
                S=S+n
              #  print (s[2*k*ans2+k:-1])
                S=S+s[2*k*ans2+k::]
        elif ans1<k:
                w=s[2*k*ans2::]
                n=w[::-1]
                #s.replace(s[2*k*ans2:-1],n)
                S=S+n
        return S
            
        
        

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章