分析:首先,循环左移的意思类似于二进制串的循环左移,对于给定的字符串S(此处的字符串仅是指字符组成的串,并不是指编程语言中的字符串类型,因为大部分编程语言中的字符串类型是无法对字符串的某一字符进行修改的,只能对整个串进行修改),如S=‘abcdefghijkl’,对其循环左移3位,则变为S=‘defghijklabc’。通过对例子分析,循环左移3位等价于循环右移了len(S)-3=9位。
其次,其要求空间复杂度为O(1),因此不能通过对字符串分段复制再拼接的方式实现,因为该种方法的空间复杂度为O(n).
最后,具体的实现方式与采用的数据结构有关系,若对字符串的存储是通过链表进行的,则实现循环左移的方式很简单,只需将第m+1个节点变为链首,前m个节点拼接到最后一个节点后面即可。
如果字符串是通过数组的方式进行存储,则可采用三次反转的方式,首先分别对前m个字符、后n-m个字符进行反转(n为字符串长度),然后对整个串再次进行反转即可。
python代码实现如下:
def swap(chuan,start,end):
while start<end:
temp = chuan[start]
chuan[start]=chuan[end]
chuan[end]=temp
start+=1
end-=1
return chuan
def main():
chuan = ['a','b','c','d','e','f','g','h','i','j','k','l']
m=4
chuan = swap(chuan,0,m-1)
chuan = swap(chuan,m,len(chuan)-1)
chuan = swap(chuan,0,len(chuan)-1)
print(chuan)
if __name__=='__main__':
main()