翻转单词顺序列
题目描述
输入一个英文句子, 翻转句子中单词的顺序, 但单词内字符的顺序不变. 为简单起见, 标点符号和普通字母一样处理. 例如输入字符串"Iam a student.", 则输出"student. a am I".
牛客上看的这个简洁
class Solution {
public:
string ReverseSentence(string str) {
string ret = "";
string temp = "";
for (int i = 0; i < str.length(); i++) {
if (' ' == str[i]) { // 交换单词顺序, 并在前面添加空格
ret = ' ' + temp + ret;
temp = "";
}
else { // 翻转单词
temp += str[i];
}
}
// 这里交换上一个for循环中并没有交换最后一个单词
if (str.length()) {
ret = temp + ret;
}
return ret;
}
};
这个和下面那个只差翻转单词时的定位不同, 下面那个用两个变量界定单词范围, 这个使用三个变量界定单词范围
class Solution {
public:
void reverseWorld(string &str, int begin, int end) {
while (begin < end) {
swap(str[begin++], str[end--]);
}
}
string ReverseSentence(string str) {
if(1 >= str.length()) {
return str;
}
int begin = 0;
int end = str.length() - 1;
// 翻转字符串
reverseWorld(str, begin, end);
begin = end = 0;
int i = 0;
while (i < str.length()) {
while ((i < str.length()) && str[i] == ' ') {
i++;
}
begin = i; // 单词开始位置
while ((i < str.length()) && str[i] != ' ') {
i++;
}
end = i - 1; // 单词结束位置
// 翻转单词
reverseWorld(str, begin, end);
}
return str;
}
};
class Solution {
public:
void reverseWorld(string &str, int begin, int end) {
while (begin < end) {
swap(str[begin++], str[end--]);
}
}
string ReverseSentence(string str) {
// 翻转字符串
if(1 >= str.length()) {
return str;
}
int begin = 0;
int end = str.length() - 1;
reverseWorld(str, begin, end);
begin = 0;
end = 0;
while (end < str.length()) {
while ((end < str.length() - 1) && (' ' != str[end])) {
//while (' ' != str[end]) { // 定界错误
end++;
}
if (end == str.length() - 1) {
reverseWorld(str, begin, end);
break;
}
else {
reverseWorld(str, begin, end - 1);
begin = end + 1;
end += 1;
}
}
return str;
}
};