首页 > 代码库 > 统计一个字符串的最后单词的长度

统计一个字符串的最后单词的长度

这道题目被归为简单题目,对我来讲,却不觉得简单。有些题目是算法题,有些题目是细节题。算法往往难想,细节往往难以实现。两者无论哪个存在难度,都不能算是简单题。

这道题目难度在于,直观上要分很多种情况讨论,而实际上可以做简单归纳,是难度大大降低。而归纳、提炼能力又有几个人能做好呢?所以此题很难。

不同的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;
}

(3)也可以领用stringstream的,但是这种做法不提倡

int lengthOfLastWord(const char *s) {
        stringstream stream(s);
        string t;
        while (stream >> t);
        return t.length();
    }




统计一个字符串的最后单词的长度