模仿答案:
class Solution {
public:
string reverseWords(string s) {
int front = 0;
int str_length = s.length();
for(int i = 0; i <= str_length; i++) {
if(i == s.length() || s[i] == ' ') {
reverse(&s[front], &s[i]);
front = i + 1;
}
}
return s;
}
};
写到vs里面:
定义字符串 s 和 p 调用reverseWords #include<iostream>
#include<sstream>
using namespace std;
string reverseWords(string s) {
int start = 0, end = 0, n = s.size();
while (start < n && end < n) {
while (end < n && s[end] != ' ') ++end;
for (int i = start, j = end - 1; i < j; ++i, --j) {
swap(s[i], s[j]);
}
start = ++end;
}
return s;
}
int main()
{
string s = "Let's take LeetCode contest";
string p;
p =reverseWords(s);
cout <<p<<endl;
return 0;
}
注:上次提到的#include<sstream>可以代替#include<string>
amazing!!!!!!!!!!!!!!!!
他说可以用reverse函数,找到空格或最后字符时将空格前的字符转置,front+1是每个字符串的首字符。
reverse(beg,end)
reverse_copy(sourceBeg,sourceEnd,destBeg)reverse()会将区间[beg,end)内的元素全部逆序;
reverse_copy()会将源区间[sourceBeg,sourceEnd)内的元素复制到"以destBeg起始的目标区间",并在复制过程中颠倒安置次序;
reverse_copy()返回目标区间内最后一个被复制元素的下一个位置,也就是第一个未被覆盖的元素;
代码
#include<iostream>
#include<string>
using namespace std;
string reverseWords(string s) {
int front = 0;
int str_length = s.length();
for (int i = 0; i <= str_length; i++) {
if (i == s.length() || s[i] == ' ') {
reverse(&s[front], &s[i]);
front = i + 1;
}
}
return s;
}
int main()
{
string s = "Let's take LeetCode contest";
string p;
p =reverseWords(s);
cout <<p<<endl;
return 0;
}