题目描述:
思路:
双指针算法,这里用的char[]数组,string应该会更简洁.
#include <iostream>
#include <cstring>
using namespace std;
char str[1010];
string s;
int len(char str[])
{
int cnt = 0;
for(int i = 0;; i ++ )
{
if(str[i]) cnt ++;
else break;
}
return cnt;
}
void reverse(char str[], int l, int r)
{
int n = len(str);
for(int i = l; i < l + (r - l + 1) / 2; i ++ )
{
char tmp = str[i];
str[i] = str[r - i + l];
str[r - i + l] = tmp;
}
}
int main()
{
int cnt = 0;
while(cin.getline(str, 1010))
{
int n = len(str);
reverse(str, 0, n - 1);
for(int i = 0; i < n; i ++ )
{
int j = i + 1;
while(j < n && str[j] != ' ') j ++;
reverse(str, i, j - 1);
i = j; // j为空格处,i ++ 后指向数字
}
cout << str << endl;
}
return 0;
}
若用string处理,则更为简洁:
class Solution {
public:
string reverseWords(string s) {
reverse(s.begin(), s.end());
for(int i = 0; i < s.size(); i ++ )
{
int j = i + 1;
while(j < s.size() && s[j] != ' ') j ++;
reverse(s.begin() + i, s.begin() + j);
i = j;
}
return s;
}
};
注意:在自己写的reverse中,l,r 为实际翻转的下标,而string中的reverse,迭代器往往指向l与r + 1处的迭代器。