lintcode :旋转字符串

题目:
旋转字符串

给定一个字符串和一个偏移量,根据偏移量旋转字符串(从左向右旋转)
样例

对于字符串 “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 仅用来检验过程,可以去掉

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值