这道题目被归为简单题目,对我来讲,却不觉得简单。有些题目是算法题,有些题目是细节题。算法往往难想,细节往往难以实现。两者无论哪个存在难度,都不能算是简单题。
这道题目难度在于,直观上要分很多种情况讨论,而实际上可以做简单归纳,是难度大大降低。而归纳、提炼能力又有几个人能做好呢?所以此题很难。
不同的case:
(1) ""
(2) "a"
(3) " "
(4) "a b "
(5) "abcd"
(6) "a "
解决这道题,如果思路错了就会很麻烦。例如,如果采用两指针法,就会繁琐,因为两个指针的位置关系没有一个不变式。如果这个思路不可行,就要及时切换。例如:
(1)从后向前扫描,因为只统计最后单词长度,所以如此切入,问题就简单很多。只用考虑空格和越界就够了。
int lengthOfLastWord(const char *s) {
int length = -1;
while (s[++length] != NULL);
for (int i = length - 1; i >= 0; i--) {
if (s[i] != ' ') {
int marker = i;
while (--i >= 0 && s[i] != ' ');
return marker - i;
}
}
return 0;
}(2)再者还是从前往后。但是,不考虑迭代过程中的其他情况,只考虑最后一个单词的长度。
int lengthOfLastWord(const char *s) {
int n;
int q, cnt=0;
for (q = 0; s[q] != '\0'; q++) {
if (s[q] != ' ')
cnt++;
else if (s[q+1] != ' ' && s[q+1] != '\0')
cnt = 0;
}
return cnt;
}
简化版:
int lengthOfLastWord(const char *s) {
int len = 0, lastlen = 0, i = 0;
while (*s) {
if (*s++ ==' ') len = 0;
else lastlen = ++len;
}
return lastlen;
}
int lengthOfLastWord(const char *s) {
stringstream stream(s);
string t;
while (stream >> t);
return t.length();
}
原文:http://blog.csdn.net/ylzintsinghua/article/details/41844497