工程家园's Archiver

zeus 发表于 2005-2-2 10:03

出道编程题,有兴趣的做一下

[color=Maroon]已知一个int型数组USER[30],其中每一个元素或为0或是其下标数加1。要求以字符串形式打印其中不为零的元素。
规则:1)不连续元素以逗号分割如:1,4,6,27,30
         2)连续元素用连字符形式,并用逗号分割每个区段,如:1-4,7,19-30
示例数组:USER[30] = {0,0,3,0,5,0,7,8,9,10,11,12,0,0,0,0,0,0,0,0,0,0,0,24,25,0,0,0,29,0}
写出算法或程序。[/color]

[color=Blue][color=Beige][color=Brown][color=Beige][color=Blue]这是一个function中的一小部分功能实现[/color][/color][/color][/color][/color]

zeus 发表于 2005-2-3 10:50

呵呵
这是我工作以后解决的第一个问题的一小部分抽象出来的一个问题

怀恋在子夜 发表于 2005-2-22 18:42

回去想想

Webmaster 发表于 2005-2-24 11:04

void function()
{
        int nCon=0;//是否连续,>=2连续.<2不连续
        bool bfirst=true;//是否第一次打印。
        for(int i=0;i<30;i++){
                if(0==USER[i]){
                        if(nCon!=0){//存在非0元素                               
                                if(!bfirst){
                                        printf(",");//非第一次打印,打印逗号,否则不打印.
                                }
                                bfirst=false;
                        }
                        if(nCon>=2){
                                printf("%d",i+1-nCon);//min
                                printf("-%d",i);//连续,当前元素为0,打印前一元素(max)
                        }
                        if(nCon==1){
                                printf("%d",i);//不连续,当前元素为0,打印前一元素。
                        }
                        nCon=0;
                }else{
                        nCon++;
                }
        }
        printf("\n");
}

[[i] Last edited by Webmaster on 2005-2-24 at 11:08 [/i]]

zeus 发表于 2005-2-24 13:00

还好

看了一下, 如果最后一个元素不为0 ,你怎么处理, 考虑一下边界条件

还有 应该是(0==USER[i]) 吧

Webmaster 发表于 2005-2-24 14:06

呵呵,真没考虑最后一个不为0.
改一下吧.
if(0==USER[i]){
//....
}else{
    nCon++;
    if(29==i){//最后不为0,i为当前max位,值为i+1
        printf(",");
        if(nCon>1){
                        printf("%d",i+1+1-nCon);//min
                printf("-%d",i+1);//max
    }else{
                printf("%d",i+1);
    }
}

Webmaster 发表于 2005-2-24 14:08

我怎么感觉我写的这么麻烦呢?
要是能这样就好了:
lsakdjflsa d
asdfjkl;asdj
ok
bye
呵呵。

Webmaster 发表于 2005-2-24 14:15

合起来.
[code]
void function()
{
        int nCon=0;//是否连续,>=2连续.<2不连续
        bool bfirst=true;//是否第一次打印。
        for(int i=0;i<30;i++){
                if(0==USER[i]){
                        if(nCon!=0){//存在非0元素                                
                                if(!bfirst){
                                        printf(",");//非第一次打印,打印逗号,否则不打印.
                                }
                                bfirst=false;
                        }
                        if(nCon>=2){
                                printf("%d",i+1-nCon);//min
                                printf("-%d",i);//连续,当前元素为0,打印前一元素(max)
                        }
                        if(nCon==1){
                                printf("%d",i);//不连续,当前元素为0,打印前一元素。
                        }
                        nCon=0;
                }else{
                        nCon++;
                        if(29==i){//最后不为0,i为当前max位,值为i+1
                                printf(",");
                                if(nCon>1){//连续
                                        printf("%d",i+1+1-nCon);//min
                                        printf("-%d",i+1);//max
                                }else{
                                        printf("%d",i+1);
                                }
                                
                        }
                }
        }
        printf("\n");
}
[/code]欢迎大家批评指正.

[[i] Last edited by Webmaster on 2005-2-24 at 14:21 [/i]]

Webmaster 发表于 2005-2-24 17:40

[color=blue]没反映了?我怎么感觉我在帮人家做作业啊?[/color]

zeus 发表于 2005-2-24 21:01

怎么没考虑用指针做呢
这可是c语言的精髓的一部分呀

Webmaster 发表于 2005-2-25 08:37

你用指针做吧.
因为容易出现内存泄露和访问非法地址的原因,我习惯了能不用指针就不用指针。
指针是个很好的方式,但用不好也会造成很大的麻烦。

zeus 发表于 2005-2-25 09:08

你只是听说把
可能还没体验过什么叫内存泄露
几千甚至几万行的程序可能还感觉不到内存泄露
这样的问题往往在大的project中才会出现
况且 现在已经有检测程序代码是否存在内存泄露的工具
呵呵
不必担心

Webmaster 发表于 2005-2-25 09:24

呵呵.你知我干嘛的?

zeus 发表于 2005-2-25 09:38

斑竹阿
呵呵

Webmaster 发表于 2005-2-25 11:22

哈哈
你怎么不用指针做呢?我看看。

casta1985 发表于 2005-2-26 10:35

哇,看两个高人讨论那么深奥的问题,好崇拜啊,我很努力的学,C语言仍然只是学到皮毛而已,惭愧啊

Webmaster 发表于 2005-2-28 13:36

楼上,你挖苦我们呢?不就是一个小题目大家玩玩么。

页: [1]

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.