1.题目
汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!
2.我的题解
"abcXYZdef"
循环左移三位得到"XYZdefabc"
;- 仔细观察,结果无非是将
"abc"
放到了最后面,"XYZdef"
放到前面;于是可以将原字符串分割成两部分,并重新拼接后得到循环左移的结果。 - 也没说
n
是否可以大于原字符串的长度……
class Solution {
public:
string LeftRotateString(string str, int n) {
if(str.empty())return str;
return str.substr((n+str.size())%str.size())
+ str.substr(0,(n+str.size())%str.size());
}
};
3.别人的题解
3.1 字符串的反转
- 假设
X,Y
是字符串,XY
代表二者顺序连接,XT 代表字符串反转; - 性质:(XY)T = (YT XT )T
class Solution {
void reverse(string &s,int l,int r){
char tmp;
while(l<r){
tmp=s[l];s[l]=s[r];s[r]=tmp;
l++,r--;
}
}
public:
string LeftRotateString(string str, int n) {
if(str.empty() || n<=0)return str;
n=n%str.size();
reverse(str,0,n-1);
reverse(str,n,str.size()-1);
reverse(str,0,str.size()-1);
return str;
}
};
4.总结与反思
(1)字符串的反转与循环左移;