背景:
大三狗要找暑假实习了,今天去了华为机试,完全没有手感啊!于是,回到寝室后,决定要水一下OJ上的题。在过了一遍“写给ACMer新手的……”(这个是以前我打算搞acm时下载的,囧)文档后,开始水题了!
水题如下:
计算字符串最后一个单词的长度,单词以空格隔开。【华为OJ | 字符串最后一个单词的长度】
输入: | 一行字符串,长度小于128。 |
输出: | 整数N,最后一个单词的长度。 |
样例输入: | hello world |
样例输出: | 5 |
阅完题,我第一遍敲了如下代码:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str;
str.reserve(128);
getline(cin, str);
int len = 0;
for (string::reverse_iterator iter = str.rbegin(); *iter != ' ' && iter != str.rend(); ++iter) {
++len;
}
cout << len;
return 0;
}
提交,不出意外,答案错误,有样例不能通过!
然后我再回来看,那个 for 循环丑的不能再丑了。
string::reverse_iterator r_end = str.rend();
for (string::reverse_iterator r_iter = str.rbegin(); iter != r_end(); ++r_iter) {
if (*r_iter == ' ') {
break;
}
++len;
}
for () 只负责循环,循环无关的条件检测写在花括弧内。
由于 for () 中的条件判断是满足条件则继续,有时我们不得不把 ”当 *r_iter 为空格则停止“ 硬改为 ”当 *r_iter 不为空格则继续” 。而且,把循环无关的条件判断写想换括弧内就更美观,结构更清晰。
通过观察别人的源码,我觉得, for 循环体应该是这样的:for ( [仅循环相关语句] ) { [特殊条件检测] [主体逻辑实现] }
然后,这样子就好多了!
一眼就看得出,在倒序扫描字符串的时候,我只考虑了 (*r_iter == ' ') 这一种情况!实际上细想,应该可能行尾是空格。即,应该考虑行尾的空格和非行尾空格的两种情况。现在再来修改也很容易了:
int main()
{
string str;
str.reserve(128);
getline(cin, str);
int len = 0;
string::reverse_iterator r_end = str.rend();
for (string::reverse_iterator r_iter = str.rbegin(); iter != r_end(); ++r_iter) {
if (*iter == ' ') {
if (len == 0)
continue;
else break;
}
++len;
}
cout << len;
return 0;
}