NOTE

左旋转字符串

记录字符串循环左移的切片拼接和三次翻转实现。

Data Structures & Algorithms创建于 更新于 约 1 分钟读完historical

这是历史学习笔记,可能存在过时或不完整的理解。

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--
	}
}

4. 参考

讨论

使用 GitHub 账号参与讨论,评论会保存在 GitHub Issues 中。在 GitHub 查看