有趣的算法-旋转字符串

题目:

给定一个字符串,要求把字符串前面的若干个字符移动到字符串的尾部,如把字符串“abcdef”前面的2个字符'a'和'b'移动到字符串的尾部,使得原字符串变成字符串“cdefab”。请写一个函数完成此功能,要求对长度为n的字符串操作的时间复杂度为 O(n),空间复杂度为 O(1)。


说明:

    因为Python的字符串是不可变对象,所以,这里使用了list = ['']代替了C语言里的字符串.


暴力旋转:

#coding:utf8

#sorign 原始字符串
#starget 目标字符串,需要用来移动的那小段
#start 需要移动字符串在原始字符串中的下标
#end 目标字符串,最终需要被移动到的在原始字符串的下标位置
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代码:

#coding:utf8
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

#s 需要进行操作的数组
#end 需要旋转的位置
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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值