题目描述
牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?
/*
思路1:两次翻转
先将字符串整体翻转
再一次翻转每个单词
*/
class Solution {
public:
string ReverseSentence(string str) {
int len = str.length();
string &temp = str;
reserve(temp,0,len-1);
int s = -1;
for(int i=0;i<len;i++){
if(str[i] == ' '){
reserve(temp,s+1,i-1);
s = i;
}
}
reserve(temp,s+1,len-1);
return str;
}
void reserve(string &s,int start,int end){
char temp;
while(start < end){
temp = s[start];
s[start] = s[end];
s[end] = temp;
start++;
end--;
}
}
};
/*
思路2:
利用分割函数将单词切割,并保存在数组里;
然后按照从后往前的数组顺序,依次拼接字符串。
*/
class Solution {
public:
string ReverseSentence(string str) {
vector<string> tempv = split(str," ");
string res;
for(int i=tempv.size()-1;i>=1;i++){
res = res + tempv[i] + ' ';
}
res = res + tempv[0];
return res;
}
vector<string> split(const string& str, const string& delim) {
vector<string> res;
if("" == str) return res;
//先将要切割的字符串从string类型转换为char*类型
char * strs = new char[str.length() + 1] ; //不要忘了
strcpy(strs, str.c_str());
char * d = new char[delim.length() + 1];
strcpy(d, delim.c_str());
char *p = strtok(strs, d);
while(p) {
string s = p; //分割得到的字符串转换为string类型
res.push_back(s); //存入结果数组
p = strtok(NULL, d);
}
return res;
}
};