题目1
问题重述:
题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student",则输出"student. a am I"。
思路解析:
对于这个题目,我们可以先将字符串整体进行翻转,然后再在每个单词的内部进行翻转,即得到我们想要的答案,具体见代码。
代码实现:
class Solution {
public:
string ReverseSentence(string str) {
//先将整体翻转,再在每个单词内部进行反转
//翻转句子
Reverse(str,0,str.size()-1);
//单词内部进行反转
int current = 0;
int start = 0;
int end = 0;
while(end<str.size())
{
if(end==str.size()-1)
{
Reverse(str,start,end);
}
else if(str[end]==' ')
{
Reverse(str,start,end-1);
start = end+1;
}
++end;
}
return str;
}
void Reverse(string &str,int start,int end)
{
while(start<end)
{
char temp = str[end];
str[end] = str[start];
str[start] = temp;
++start;
--end;
}
}
};
题目2
问题重述:
题目:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的末尾。请定义一个函数实现字符串左旋操作的功能,比如输入字符串“abcdefg”和数字2,则函数将返回左旋转2位得到的结果“cdefgab”。
思路解析:
首先我们记字符串的长度位len,左旋转位数位n,我们首先将字符串0~n-1进行翻转,然后将字符串n~length进行翻转,最后将字符串整体进行翻转,即可以得到我们想要的答案。
代码实现:
class Solution {
public:
string LeftRotateString(string str, int n) {
int length = str.size()-1;
if(n>length||n<=0)
return str;
//先分步翻转,再整体翻转
Reserve(str, 0, n-1);
Reserve(str, n,length);
Reserve(str, 0, length);
return str;
}
void Reserve(string &str,int start,int end)
{
while(start<end)
{
char temp = str[start];
str[start] = str[end];
str[end] = temp;
++start;
--end;
}
}
};