题目一:翻转单词顺序
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。
例子:
如,输入字符串“I am a student.”,则输出“student. a am I”。
链接:
剑指Offer(第2版):P284
思路标签:
- 算法:句子翻转 + 单词翻转
解答:
- 第一步:翻转整个句子;
- 第二步:翻转每个单词。
- 注意:句子和单词的边界条件处理。
class Solution {
public:
string ReverseSentence(string str) {
if(str.length() <= 0)
return str;
int begin = 0;
int end = str.length()-1;
//反转整个句子
Reverse(begin, end, str);
//反转句子中的每个单词
begin = end = 0;
while(str[begin] != '\0'){
if(str[begin] == ' '){
begin++;
end++;
}
else if(str[end] == ' ' || str[end] == '\0'){
Reverse(begin, --end, str);
begin = ++end;
}
else
end++;
}
return str;
}
void Reverse(int begin, int end, string& str){
if(begin < 0 || end < 0)
return;
while(begin < end){
char temp = str[begin];
str[begin] = str[end];
str[end] = temp;
begin++;
end--;
}
}
};
题目二:左旋转字符串
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋操作的功能。
例子:
如,输入字符串“abcdefg”和数字2,该函数将返回左旋两位得到的结果“cdefgab”。
链接:
剑指Offer(第2版):P286
思路标签:
- 算法:双指针
解答:
- 和上面的思路类似,我们可以将字符串分成两部分,先分别翻转两部分子字符串;
- 然后对翻转后的字符串整体再进行一次翻转。
class Solution {
public:
string LeftRotateString(string str, int n) {
int length = str.length();
if(length > 0 && n > 0 && n < length){
int firstBegin = 0;
int firstEnd = n-1;
int secondBegin = n;
int secondEnd = length - 1;
Reverse(firstBegin, firstEnd, str);
Reverse(secondBegin, secondEnd, str);
Reverse(firstBegin, secondEnd, str);
}
return str;
}
void Reverse(int begin, int end, string &str){
if(begin < 0 || end < 0)
return;
while(begin < end){
char temp = str[begin];
str[begin] = str[end];
str[end] = temp;
begin++;
end--;
}
return;
}
};