字符串循环左移

作者: ccup区块链 | 来源:发表于2018-05-25 12:31 被阅读8次

    问题描述:给定一个字符串,将若干个字符移动到该字符串尾部
    例:1234abc将前四个字符移动到尾部,输出abc1234

    思路

    • 蛮力法,移动
      • 时间复杂度高
    • 分部拷贝,交换
      • 空间复杂度高
    • 三步翻转
      • 时间复杂度O(n)
      • 空间复杂度O(1)

    golang代码如下:(三步反转)

    //三步翻转
    func stringRevote(start, end int, str []byte) {
    
        if start < 0 || end > len(str)-1 {
            log.Fatal("起始位置或终止位置错误")
        }
        //golang中切片是传址
        for start < end {
            //第一个跟最后一个换
            str[start], str[end] = str[end], str[start]
            //起始点向后移动
            start++
            //终止点向前移动
            end--
        }
    }
    
    func main() {
        var s []byte
        var end int
        fmt.Println("请输入字符串:")
        fmt.Scanf("%s", &s)
    
        fmt.Println("请输入移动几个字符:")
        fmt.Scanf("%d", &end)
    
        stringRevote(0, end-1, s)
        fmt.Printf("%s\n", s)
    
        stringRevote(end, len(s)-1, s)
        fmt.Printf("%s\n", s)
    
        stringRevote(0, len(s)-1, s)
        fmt.Printf("%s\n", s)
    
    }
    
    

    分部拷贝,交换

    func stringRotation(s string, index int) string {
        if index > len(s) {
            return "error:index超出长度"
        }
        sb := []byte(s)
        //截取两部分,temp暂存前半部分,即将旋转到后半部分位置
        temp := sb[:index]
        //sb切割掉前半部分,重新赋值为后半部分
        sb = sb[index:]
        //将前半部分的值,正序追加到sb尾部
        for i := 0; i < index; i++ {
            sb = append(sb, temp[i])
        }
        return string(sb)
    
    }
    
    

    相关文章

      网友评论

        本文标题:字符串循环左移

        本文链接:https://www.haomeiwen.com/subject/uviyjftx.html