题目:
给定一个字符串,要求把字符串前面的若干个字符移动到字符串的尾部,如把字符串“abcdef”前面的2个字符'a'和'b'移动到字符串的尾部,使得原字符串变成字符串“cdefab”。请写一个函数完成此功能,要求对长度为n的字符串操作的时间复杂度为 O(n),空间复杂度为 O(1)。
说明:
因为Python的字符串是不可变对象,所以,这里使用了list = ['']代替了C语言里的字符串.
暴力旋转:
def shiftCharP(sorigin, starget, start, end):
'逐个移位,暴力移位法'
leno = len(sorigin)
lent = len(starget)
offset = end - start
print 'leno:%d,lent:%d,offset:%d'%(leno,lent,offset)
for i in range(lent):
t = sorigin[start]
for index in range(offset):
sorigin[start + index] = sorigin[start+index+1]
print index,' - ',sorigin[start]
sorigin[start + offset] = t
print "i:%d,start:%d,offset:%d"%(i,start,offset)
print starget
print sorigin
'''
测试代码
'''
ass = ['1',' ','2','3','4',' ','5','6','7','8',' ','9']
ts = ['2','3','4']
shiftCharP(ass, ts, 2, len(ass) -1)
巧妙旋转:
说明:
将需要操作的字符串看成一个数组,origin[],将origin分成AB两组,按题目要求实现旋转成BA,A' = A^T, B' = B^T, 反转(A^T+B^T)^T = BA
Python代码:
def refs(s):
'反转数组元素'
length = len(s)
start = 0
end = length - 1
while start < end:
t = s[start]
s[start] = s[end]
s[end] = t
start += 1
end -= 1
return s
def useRefsToTail(s, end):
'旋转移位'
length = len(s)
ss = refs(s[:end]) + refs(s[end: length])
print ss
ss = refs(ss)
print ss
return ss
'''
以下测试代码:
'''
s = ['i',' ','l','o','v','e',' ','u']
print useRefsToTail(s, 2)