| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1049 人关注过本帖
标题:C算法上一道题,请大家帮我看看有什么思路。
只看楼主 加入收藏
zl520k
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2013-2-18
结帖率:0
收藏
已结贴  问题点数:20 回复次数:17 
C算法上一道题,请大家帮我看看有什么思路。
编写一段有效的程序,求已知串中最长空格序列的长度,要求尽量少检查串的字符。
提示:空格序列长度增大,程度将变得更快。
搜索更多相关主题的帖子: 看看 
2013-02-18 15:36
a151141
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:1
帖 子:197
专家分:680
注 册:2012-10-19
收藏
得分:3 
有点抽象

世界上幸福的事就是抓到一只羊,更幸福的事就是抓到两只羊……
2013-02-18 18:11
青春无限
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江苏
等 级:贵宾
威 望:24
帖 子:3452
专家分:19340
注 册:2012-3-31
收藏
得分:3 
看看

学 会看代码…学习写程序…学会搞开发…我的目标!呵呵是不是说大话啊!!一切皆可能
2013-02-18 18:19
zyy_hz
Rank: 2
等 级:论坛游民
帖 子:8
专家分:24
注 册:2013-2-18
收藏
得分:3 
有一种思路就是一下:
    比如说前面已经知道了最长为7个,如果后面的第13个不为空格,就可以直接跳到第14个判断了,因为8和12之间的都不需要判断。
    不知道对你有没有用。
新手上路。多指教。
2013-02-18 21:22
zyy_hz
Rank: 2
等 级:论坛游民
帖 子:8
专家分:24
注 册:2013-2-18
收藏
得分:0 
好像有点问题可以这样直接判断第15个,如果第15个不是则可以跳到16个重新开始,因为是要最长的长度。如果15个也是的话就看中间的,然后看后一段直至都是空格,如果其中有个不是空格就可以跳了。
2013-02-18 21:32
zl520k
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2013-2-18
收藏
得分:0 
网上有人说折半进行查找空格的,不知道对不对?
2013-02-20 15:13
fanpengpeng
Rank: 8Rank: 8
来 自:南极洲
等 级:蝙蝠侠
威 望:7
帖 子:299
专家分:849
注 册:2013-2-1
收藏
得分:3 
用zyy_hz说的方法写了一个程序,不知道合不合要求
程序代码:
#include <stdio.h>
#include <string.h>

/***********************************

 * 参数len: 字符串长度
            防止指针在间跳后越界 

 **********************************/
int max_blankarr(char *str, int len);

int main()
{
    char test[] = "The following string has 20 blankspaces:                    ";
    
    printf("The max blank arry length is %d.\n", max_blankarr(test, strlen(test)));
    
    return 0;
}

int max_blankarr(char *str, int len)
{
    int maxlen, index, i;
    
    for(maxlen = 0, index = 0; index+maxlen < len; index++){
        if(str[index] == ' ')
            if(str[index+maxlen] == ' '){
                i = 1;
                while(++index < len && str[index] == ' ') ++i;
                (i > maxlen)? maxlen = i : maxlen;
            }
            else index += maxlen;
    }
    
    return maxlen;
}


人生是一场错过 愿你别蹉跎
2013-02-20 15:31
fanpengpeng
Rank: 8Rank: 8
来 自:南极洲
等 级:蝙蝠侠
威 望:7
帖 子:299
专家分:849
注 册:2013-2-1
收藏
得分:0 
上面的max_blankarr函数重新优化了一下,这样效率比刚才那个要高
程序代码:
int max_blankarr(char *str, int len)
{
    int maxlen, index, i;
    
    for(maxlen = 0, index = 0; index+maxlen < len; index++){
        if(str[index+maxlen] != ' ')
            index += maxlen;
        else
            if(str[index] == ' '){
                i = 1;
                while(++index < len && str[index] == ' ') ++i;
                (i > maxlen)? maxlen = i : maxlen;
            }
    }
    
    return maxlen;
}

人生是一场错过 愿你别蹉跎
2013-02-20 16:38
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:3 
我不信能有比O(n)更高效的算法。要求尽量少检查串的字符,但每个字符至少得检查一次吧。提示更是莫名其妙。
程序代码:
int blank_len(char *s)
{
    int max, c;
    for(max = c = 0; *s; s++)
        if(*s == ' ') c++;
        else
        {
            if(max < c) max = c;
            c = 0;
        }
    return max > c ? max : c;
}


[ 本帖最后由 beyondyf 于 2013-2-20 19:54 编辑 ]

重剑无锋,大巧不工
2013-02-20 19:52
fanpengpeng
Rank: 8Rank: 8
来 自:南极洲
等 级:蝙蝠侠
威 望:7
帖 子:299
专家分:849
注 册:2013-2-1
收藏
得分:0 
楼上的回答欠考虑,关于这个问题每个字符都检查一遍是最低效的实现方法
其实存在许多不必要的比较可以优化掉的
当已经搜索到最长为n的连续空格时,继续搜索时如果当前位置后n+1处的字符不为空格,则这段字符至多为n个连续的空格
完全可以跳过不比较,当连续空格越长时这样的优势会更明显
举个例子来说:“a__b__f”,'_'表示空格
当我们检查到b的时候,就已经知道最大长度至少是2,那么接着只要直接看后面2+1处的字符,即f,不是空格,那么b后面到f这一段至多只有2个连续空格
就可以不用搜索,这里就有了优化的空间
收到的鲜花
  • beyondyf2013-02-20 20:52 送鲜花  50朵   附言:感谢指正,确实是我欠考虑了

人生是一场错过 愿你别蹉跎
2013-02-20 20:41
快速回复:C算法上一道题,请大家帮我看看有什么思路。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.054126 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved