码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-12-10 14:18:21      阅读:143      评论:0      收藏:0      [点我收藏+]

标签: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;
}

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

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!