字符串循环左移
2018-05-25 本文已影响8人
ccup区块链
问题描述:
给定一个字符串,将若干个字符移动到该字符串尾部
例:
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)
}