63 篇文章 31 订阅

链接

GitHub代码： 042-左旋转字符串

CSDN题解：剑指Offer–042-左旋转字符串

042-左旋转字符串1362-左旋转字符串剑指Offer–042-左旋转字符串042-左旋转字符串

直接找到旋转后的对应关系

* 新串i位置的元素，其实是原来串i+n位置的元素，
* 当然i+n如果超过了字符串的长度，就会被循环移位到左侧，即(i+n) % str.size()
* 另外，如果移位n超过了字符串长度，那么只需要移动n%str.size()位即可

#include <iostream>

using namespace std;

//  调试开关
#define __tmain main

#ifdef __tmain

#define debug cout

#else

#define debug 0 && cout

#endif // __tmain

class Solution
{
public:
string LeftRotateString(string str, int n)
{
if(str.size( ) == 0)
{
return "";
}
/// 012345678
/// abcXYZdef
/// XYZdefabc
/// 012345678
///
/// res[i] = str[(i + n) % str.size( )];
/// res[(i - n + str.size( )) % str.size()] = str[i];

string res(str);
if(n > str.size( ))
{
n %= str.size( );
}
debug <<"length = " <<str.size( ) <<", n = " <<n <<endl;
for(int i = 0; i < str.size( ); i++)
{
debug <<"i = " <<i <<", ori = " <<((i + n) % str.size( )) <<endl;
res[i] = str[(i + n) % str.size( )];
}

return res;
}

string Reverse(string str)
{
int left = 0, right = str.size( ) - 1;

while(left < right)
{
swap(str[left], str[right]);
left++;
right--;
}

return str;
}
};

int __tmain( )
{
Solution solu;

cout <<solu.LeftRotateString("abcXYZdef", 3) <<endl;

return 0;
}

新串是str+str串第n位到底n+str.size()的字串

class Solution
{
public:
string LeftRotateString(string str, int n)
{
/// abcXYZdef
/// abcXYZdefabcXYZdef
/// 012345678
/// 新的串是两倍串第len位起始长度为n字串
int length = str.size( );

if(length == 0)
{
return "";
}
n = n % len;
str += str;

return str.substr(n, len);
}
};

通过翻转直线循环移位

1. reverse(0,i-1);

2. reverse(i,n-1);

3. reverse(1,n-1);

1. abc defg -=> cba defg

2. cba defg -=> cba gfed

3. cba gfed -=> defg abc

class Solution
{
public:
string LeftRotateString(string str, int n)
{
if(str.size( ) == 0)
{
return "";
}
n %= str.size( );

Reverse(str, 0, n - 1);
Reverse(str, n, str.size( ) - 1);
Reverse(str, 0, str.size( ) - 1);

return str;
}

void Reverse(string &str, int left, int right)
{
while(left < right)
{
swap(str[left], str[right]);

left++;
right--;
}
}
};

class Solution
{
public:
string LeftRotateString(string str, int n)
{
if(str.size( ) == 0)
{
return "";
}
n %= str.size( );

Reverse(str, 0, n - 1);
Reverse(str, n, str.size( ) - 1);
Reverse(str, 0, str.size( ) - 1);

return str;
}

void Reverse(string &str, int left, int right)
{
while(left < right)
{
swap(str[left], str[right]);

left++;
right--;
}
}
};

04-26 393
07-01 480
11-20 199
11-09 378
11-04 258
11-25 51
11-18 4600
04-24 328
03-09 711

“相关推荐”对你有帮助么？

• 非常没帮助
• 没帮助
• 一般
• 有帮助
• 非常有帮助

CHENG Jian

¥2 ¥4 ¥6 ¥10 ¥20

1.余额是钱包充值的虚拟货币，按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载，可以购买VIP、C币套餐、付费专栏及课程。