题干:
输入一个字符串,字符串中可能包含多个连续的空格,请将多余的空格去掉,只留下一个空格。
输入格式:
共一行,包含一个字符串。
输出格式:
输出去掉多余空格后的字符串,占一行。
分析:
在字符串的读入中,由于cin和scanf可以自动过滤空格和换行,因此容易得到eazy版本的解题方法,如下:
#include <iostream>
using namespace std;
int main()
{
string s;
while ( cin >> s ) {
cout << s << ' ' ;
}
return 0;
}
但是我们并不满足于这种简单的解题方法,
我们知道,关于字符串的读入,可以利用getline()读入整行字符串(包括空格和换行),那么在此基础上,我们只需要再对已经读入的整行字符串进行处理,将其中连续重复出现的空格跳过,并输出处理过的字符串即可,由此引出今天的主要内容:“第一类双指针算法”
具体方法如下:
#include <iostream>
using namespace std;
int main()
{
string s;
getline ( cin , s );
string r;
for ( int i = 0; i < s.size() ; i++ ){
if ( s[i] != ' ' ){
r += s[i];
}else {
r += ' ';
int j = i;
while ( s[j] == ' ' ) j++; //跳过重复的空格
i = j - 1; //注意此时i的值还未+1
}
}
cout << r << endl ;
return 0;
}
(ps:初学者学习记录)