题目:
旋转字符串
给定一个字符串和一个偏移量,根据偏移量旋转字符串(从左向右旋转)
样例
对于字符串 “abcdefg”.
offset=0 => “abcdefg”
offset=1 => “gabcdef”
offset=2 => “fgabcde”
offset=3 => “efgabcd”
挑战
在数组上原地旋转,使用O(1)的额外空间
方法一
class Solution:
"""
@param str: An array of char
@param offset: An integer
@return: nothing
"""
def rotateString(self, s, offset):
# write you code here
# write you code here
if len(s) != 0:
print(offset)
offset = offset % len(s)
offset = len(s) - offset
while offset > 0:
tmp = s[0]
print(tmp)
for i in range(0,len(s) - 1):
s[i] = s[i + 1]
s[-1] = tmp
offset = offset -1
这种方法较慢,先把每个字符向右移动一个位置,然后重复多次,达到题目要求。
方法二
class Solution:
# @param s: a list of char
# @param offset: an integer
# @return: nothing
def rotateString(self, s, offset):
# write you code here
if s!=None and len(s)!=0:
left = 0
right = len(s) - 1
offset = offset%(right+1)
self.rotateStr(s,0,right - offset)
self.rotateStr(s,right - offset + 1,right)
self.rotateStr(s,0,right)
def rotateStr(self,s,left,right):
while left<right:
tmp = s[left]
s[left] = s[right]
s[right] = tmp
left += 1
right -= 1
如“a,b,c,d,e,f,g”向右平移两位,结果为—>“f,g,a,b,c,d,e”。
这种方法将一组数据分成两组。“a,b,c,d,e”, “f,g”
前部分倒序处理,“a,b,c,d,e”—>“e,d,c,b,a” ,
后部分倒序处理,“f,g”—>“g,f”
组合起来再整体倒序“e,d,c,b,a,g,f” —>“f,g,a,b,c,d,e”
参考:https://www.cnblogs.com/theskulls/p/4886379.html
再次写:
class Solution:
"""
@param str: An array of char
@param offset: An integer
@return: nothing
"""
def rotateString(self, s, offset):
# write your code here
left = offset[:-s]
right = offset[-s:]
# left = self.reverse( a, left)
# 左边倒序
start = 0
end = len(left) - 1
while end > start:
print("start:", start, "end:", end)
tmp = left[start]
left[start] = left[end]
left[end] = tmp
start = start + 1
end = end - 1
print(left)
# right = self.reverse(a, right)
#右边倒序
start = 0
end = len(right) - 1
while end > start:
print("start:", start, "end:", end)
tmp = right[start]
right[start] = right[end]
right[end] = tmp
start = start + 1
end = end - 1
print(right)
# list = self.reverse( a,left + right)
#整体倒序
start = 0
list = left + right
print(list)
end = len(list) - 1
while end > start:
print("start:", start, "end:", end)
tmp = list[start]
list[start] = list[end]
list[end] = tmp
start = start + 1
end = end - 1
print(list)
return list
-----------------------------------------------------------分割线
a= Solution
offset = ['a','b','c','d','e','f']
a.rotateString('',3,offset)
这么写不通过,原因没有在原列表上修改。
修改后:
class Solution:
"""
@param str: An array of char
@param offset: An integer
@return: nothing
"""
def rotateString(self, s, offset):
# write your code here
# 左边倒序
if len(s) != 0:
offset = offset % len(s)
start = 0
end = len(s) - offset -1
while end > start:
print("start:", start, "end:", end)
tmp = s[start]
s[start] = s[end]
s[end] = tmp
start = start + 1
end = end - 1
print(s)
# right = self.reverse(a, right)
start = len(s) - offset
end = len(s) - 1
while end > start:
print("start:", start, "end:", end)
tmp = s[start]
s[start] = s[end]
s[end] = tmp
start = start + 1
end = end - 1
print(s)
# list = self.reverse( a,left + right)
start = 0
end = len(s) - 1
while end > start:
print("start:", start, "end:", end)
tmp = s[start]
s[start] = s[end]
s[end] = tmp
start = start + 1
end = end - 1
print(s)
print 仅用来检验过程,可以去掉