算法学习:每日一题 No.434
434. 字符串中的单词数
背景:字符串
目的:统计单词数
方法:字符串遍历(硬起名字)
string s = "Hello, my name is John"
在这个命题当中,指出了单词是连续的不是空格的字符,也就是说 Hello,
算作一个单词。
我们的目的也就明确了:找出空格后的第一个字符,就相当于找到了一个字符串。即该位置本身不是空格,该位置的前一位是空格。
也存在特殊的情况,比如字符串的开始就是一个单词,然而只用上面的方法会丢掉这个单词。
所以对于字符串的开始要特殊处理:字符串开始如果不是空格,那么就算是一个单词,不需要看前一位是不是空格。
这里就需要用到 逻辑运算符 短路的性质。
我们希望字符串开始时不进行前一位的判断:
if(i == 0 || s.at(i - 1) == ' '){}
||
可以帮助到我们,当 ` i == 0 ` 时表明是字符串的开始,运算符左侧为真,就不再进行右侧的运算,也就达到了我们的目的。
字符串起始之外的判断方式:
if(s.at(i - 1) == ' ' && s.at(i) != ' '){}
如果两段逻辑直接组合的话会出现越界的情况,即当 i = 0
时, i - 1
发生越界,我们需要避免这种状况。
if ((i==0 || s.at(i - 1) == ' ' ) && s.at(i) != ' ')
这样组合就可以达到我们的目的,最终完整的程序如下:
class Solution {
public:
int countSegments(string s) {
int count = 0;
for (int i = 0; i < s.size(); ++i)
{
if ((i==0 || s.at(i - 1) == ' ' ) && s.at(i) != ' ')
{
++count;
}
}
return count;
}
};
总结
逻辑运算短路的性质会经常出现。