随笔 - 87  文章 - 279  trackbacks - 0
<2006年7月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345

潜心看书研究!

常用链接

留言簿(19)

随笔分类(81)

文章分类(89)

相册

ACM OJ

My friends

搜索

  •  

积分与排名

  • 积分 - 214376
  • 排名 - 116

最新评论

阅读排行榜

评论排行榜

今天在做一道华为面试题目时候,就是因为没有将变量初始化,而导致我用了一节课的时间调试:)

题目是:找出01字符串中0和1出现的最大次数.

代码:

#include<iostream>
#include
<string>
using namespace std;
void main()
{
    
char *a="010000010111101101000000000";
    
int i,temp0=0,temp1=0,max0=0,max1=0;//对变量初始化,如果不初始化,变量值是随机的
    for(i=0;i<strlen(a);i++)
    
{
        
switch(a[i])
        
{
            
case '0':
            
{
                temp0
++;
                
if(a[i+1]=='1'||i==strlen(a)-1)
                
{
                    
if(max0<temp0) max0=temp0;
                    temp0
=0;
                }

                
break;
            }

            
case '1':
            
{
                temp1
++;
                
if(a[i+1]=='0'||i==strlen(a)-1)
                
{
                    
if(max1<temp1) max1=temp1;
                    temp1
=0;
                }

                
break;
            }

        }

    }

    cout
<<"max0="<<max0<<endl;
    cout
<<"max1="<<max1<<endl;
}


那为什么不对i初始化呢?因为尽管i没被初始化,它的初始值是随机的,但在循环参数表里面已经对他进行赋值,所以i的随机值已经被0覆盖。

posted on 2005-11-22 00:40 阅读(3554) 评论(11)  编辑 收藏 引用 所属分类: C++之梦

FeedBack:
# re: 变量初始化的重要性! 2005-11-22 10:10 沐枫网志
#include <iostream>
void main()
{
char *a="010000010111101101000000000";
int max[2] = {0, 0};
int count[2] = {0, 0};

while(*a)
{
int index = *a - '0';
count[index] ++;
count[index^1] = 0; // count[index?0:1] = 0; // count[index==0?1:0] = 0;
if(count[index] > max[index])
max[index] = count[index];
a++;
}
std::cout << "max 0: " << max[0] << std::endl;
std::cout << "max 1: " << max[1] << std::endl;
}

// output
// max 0: 9
// max 1: 4

点评:
1. 就C字串来说,从头到尾的遍历不需要for,用while是最佳选择。
2. strlen是很浪费的操作,如果非要用,对同一个不变长度的字串来说,用一个变量来存储,然后重复使用,比重复计算strlen要好得多。
3. 对数字串来说,可以直接将字符减去'0'得到相应的数字。
4. 比较判断其实并不比赋值省时,有时候直接赋值,比起比较后再赋值可能更有效率。更何况你的判断条件达三条之多才决定是否需要赋值。
所以if(a[i+1]=='0'/*或'1'*/||i==strlen(a)-1)可以省掉。
5. 利用数组的下标,会给你带来意想不到的简洁。

6. 最后,变量没有初始化,是算法设计的问题。如果初始条件都没有确定,只能说明你的算法没有想清楚。  回复  更多评论
  
# re: 变量初始化的重要性! 2005-11-22 13:02 
非常感谢网志兄的点评,又学到东西啦!
这六条评论真是受益匪浅啊!
谢谢:)  回复  更多评论
  
# re: 变量初始化的重要性! 2005-11-22 13:06 
count[index^1] = 0; // count[index?0:1] = 0; // count[index==0?1:0] = 0;

这一行不懂。。。能否解释一下,谢谢:)  回复  更多评论
  
# re: 变量初始化的重要性! 2005-11-22 13:09 
查了一下^是按位移或,不过我对位操作一窍不通。。。。。。。。  回复  更多评论
  
# re: 变量初始化的重要性! 2005-11-22 13:29 可冰
count[index^1] = 0; // count[index?0:1] = 0; // count[index==0?1:0] = 0;
//===========================
觉得不如下面这个可读性好或简洁:
count[ ! index ] = 0;

个人意见哈^-^  回复  更多评论
  
# re: 变量初始化的重要性! 2005-11-22 13:35 沐枫网志
意思是,这三条都可以。你可以选一条你认为能够理解的就可以了。
我建议用
count[index==0? 1 : 0] = 0;

至于可冰的count[!index] = 0;我觉得不好。!是表示逻辑非的操作,用在此处会让人误会,代码不好读。  回复  更多评论
  
# re: 变量初始化的重要性! 2005-11-22 21:10 
呵呵,我明白啦,感谢大家啊!  回复  更多评论
  
# re: 变量初始化的重要性! 2005-11-28 11:16 很土
变量随定义随初始化,随时的错误检查,这些都是c/c++编程必须要养成的"习惯".有无数的错误和这两个有关.  回复  更多评论
  
# re: 变量初始化的重要性! 2005-11-30 12:47 
感谢土哥!  回复  更多评论
  
# re: 变量初始化的重要性! 2010-05-06 14:00 xypforever
@沐枫网志
这位兄弟令人佩服  回复  更多评论
  
# re: 变量初始化的重要性![未登录] 2010-08-03 16:11 wang
两个程序效率比 2.8:1  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理