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