NOTE
左旋转字符串
记录字符串循环左移的切片拼接和三次翻转实现。
这是历史学习笔记,可能存在过时或不完整的理解。
1. 题目描述
汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!
2. 思路
- 翻转
3. 实现
package main
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param str string字符串
* @param n int整型
* @return string字符串
*/
//空间:O(n)
//时间:O(n)
func LeftRotateString(str string, n int) string {
if len(str) == 0 || n < 0 {
return ""
}
n = n % len(str)
res := str[n:] + str[:n]
return res
}
//空间:O(n)
//时间:O(n)
func LeftRotateString2(str string, n int) string {
if len(str) == 0 || n < 0 {
return ""
}
n = n % len(str)
//123abc
runes := []rune(str)
//321abc 先翻转前半部分
reverse(runes, 0, n-1)
//321cba 再翻转后半部分
reverse(runes, n, len(str)-1)
//abc123 最后整体翻转
reverse(runes, 0, len(str)-1)
return string(runes)
}
func reverse(runes []rune, i int, j int) {
for i < j {
runes[i], runes[j] = runes[j], runes[i]
i++
j--
}
}
讨论
使用 GitHub 账号参与讨论,评论会保存在 GitHub Issues 中。在 GitHub 查看