个人分类: LeetCode C++ DataStructure&Algorithms
所属专栏: LeetCode算法分析
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/geekmanong/article/details/50913518
一、题目描述
汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!
二、解题思路
经典的三次翻转:
1.先翻转字符串前n个字符;
2.再翻转后面的字符;
3.翻转整个字符串;
比如:输入字符串s="12345abc",n=5;首先翻转前5个字符变成54321abc,然后翻转后面的字符变成54321cba,最后翻转整个字符串变成abc12345
-
class Solution {
-
public:
-
string LeftRotateString(string str, int n) {
-
if (str.empty() || n>str.length()) return str;
-
char *pData = const_cast<char*>(str.data());
-
if (str.length() > 0 && n > 0 && n < str.length())
-
{
-
char* pBegin = pData + 0;
-
char* pEnd = pData + n - 1;
-
char* pBegin2 = pData + n;
-
char* pEnd2 = pData + str.length() - 1;
-
reverse(pBegin, pEnd);//翻转字符串前面n个字符
-
reverse(pBegin2, pEnd2);//翻转字符串的后面部分
-
reverse(pBegin, pEnd2);//翻转整个字符串
-
}
-
return str;
-
}
-
void reverse(char* pBegin, char* pEnd)
-
{
-
if (pBegin == NULL || pEnd == NULL) return;
-
while (pBegin<pEnd)
-
{
-
char temp = *pBegin;
-
*pBegin = *pEnd;
-
*pEnd = temp;
-
pBegin++;
-
pEnd--;
-
}
-
}
-
};