标签:style ar sp for on 问题 bs amp as
这道题目被归为简单题目,对我来讲,却不觉得简单。有些题目是算法题,有些题目是细节题。算法往往难想,细节往往难以实现。两者无论哪个存在难度,都不能算是简单题。
这道题目难度在于,直观上要分很多种情况讨论,而实际上可以做简单归纳,是难度大大降低。而归纳、提炼能力又有几个人能做好呢?所以此题很难。
不同的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(); }
标签:style ar sp for on 问题 bs amp as
原文地址:http://blog.csdn.net/ylzintsinghua/article/details/41844497