// 面试题58(一):翻转单词顺序
// 题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。
// 为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. ",
// 则输出"student. a am I"。
#include <iostream>
#include <string>
using namespace std;
class SL{
public:
string ReverseSentence(string str)
{
int len=str.length();
if(len==0)
return " ";
//翻转整个句子
Reverse(str,0,len-1);
cout<<str<<endl;//翻转后的句子
//根据逗号寻找单词,翻转单词
int i=0;
int j=0;
while(i<len)
{
//单词开头
if(str[i]==' ')
{
i++;
j++;
}
if(str[j]!=' ' && str[j]!='0')
{
j++;
}
//寻找结尾
else
{
Reverse(str,i,j--);
i=++j;
}
// cout<<"i= "<<i<<endl;
// cout<<"j= "<<j<<endl;
cout<<str<<endl;
}
return str;
}
void Reverse(string &str,int start,int end)
{
while(start<end)
{
char temp=str[start];
str[start]=str[end];
str[end]=temp;
start++;
end--;
}
}
};
int main()
{
string str = "I am a student. ";
SL sl;
sl.ReverseSentence(str);
return 0;
}
// 面试题58(二):左旋转字符串
// 题目:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。
// 请定义一个函数实现字符串左旋转操作的功能。比如输入字符串"abcdefg"和数
// 字2,该函数将返回左旋转2位得到的结果"cdefgab"。
#include <iostream>
#include <string>
using namespace std;
class SL{
public:
string LeftRotateString(string str,int n)
{
int len=str.length();
if(len==0)
return " ";
if(len>0&&n>0&&n<len)
{
int FirstStart=0;
int FirstEnd=FirstStart+n-1;
int SecondStart=FirstStart+n;
int SecondEnd=FirstStart+len-1;
//翻转字符串前n个字符
Reverse(str,FirstStart,FirstEnd);
//翻转字符串后面字符
Reverse(str,SecondStart,SecondEnd);
//翻转整个字符
Reverse(str,FirstStart,SecondEnd);
cout<<str<<endl;
}
return str;
}
void Reverse(string &str,int start,int end)
{
while(start<end)
{
char temp=str[start];
str[start]=str[end];
str[end]=temp;
start++;
end--;
}
}
};
int main()
{
string str = "abcdefg";
int n=2;
SL sl;
sl.LeftRotateString(str,n);
return 0;
}