zerofly's Blog

努力不一定成功,但不努力一定不会成功

0%

左旋转字符串



题目描述

汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!

解题思路

通过给的例子,我第一个想法是,使用queue容器,但发现给的程序返回类型为 string,所以应该是直接对给定的字符串进行操作。

怎样把字符串前面的字符和后面的字符交换位置呢?想到了swap()交换函数。

  • 先将前 n-1字符翻转;
  • 再将剩余的字符翻转;
  • 将翻转后的字符组成新的字符串,然后将新字符串翻转,即可得到结果;

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Solution
{
public:
string LeftRotateString(string str, int n)
{
int length = str.size();
if (length == 0 || n < 0 || n > length)
return "";

string result = str;
// 翻转前 n 个字符
Reverse(result, 0, n - 1);
// 翻转剩余字符
Reverse(result, n, length - 1);
// 翻转新的字符串
Reverse(result, 0, length - 1);

return result;
}

// 翻转函数
void Reverse(string &str, int begin, int end)
{
while (begin < end)
swap(str[begin++], str[end--]);
}
};

参考链接:https://cuijiahua.com/blog/2018/01/basis_43.html

文章作者:zerofly

发布时间:2020年06月01日 - 09:06

原始链接:http://zeroflycui.github.io/eb78a2fc.html

许可协议: 转载请保留原文链接及作者。