Impossible is nothing
爱过知情重醉过知酒浓 花开花谢终是空 缘份不停留像春风来又走 女人如花花似梦
公告
日历
<
2024年12月
>
日
一
二
三
四
五
六
24
25
26
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
统计
随笔 - 8
文章 - 91
评论 - 16
引用 - 0
导航
C++博客
首页
发新随笔
发新文章
联系
聚合
管理
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(4)
给我留言
查看公开留言
查看私人留言
随笔分类
(4)
STL/BOOST(4)
(rss)
随笔档案
(8)
2006年6月 (2)
2006年4月 (4)
2006年3月 (1)
2006年2月 (1)
文章分类
(77)
C++语言(57)
(rss)
GDI/GDI+(1)
(rss)
Windows/MFC(3)
(rss)
编译器(4)
(rss)
软件工程(11)
(rss)
图像处理(1)
(rss)
文章档案
(91)
2006年7月 (4)
2006年6月 (12)
2006年5月 (3)
2006年4月 (4)
2006年3月 (27)
2006年2月 (41)
相册
文章用图
搜索
最新评论
1. re: STL学习笔记[未登录]
很详细,赞
--bneliao
2. re: 深度探索c++的对象模型
笔记很详细,赞
--bneliao
3. re: 近日复习记录
不错嘛!
--秦歌
4. re: 区域填充算法
顶顶顶顶顶顶顶顶
顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶
顶顶顶顶
顶顶顶顶
顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶
顶顶顶顶
--lishali
5. re: Singleton模式的演化[未登录]
评论内容较长,点击标题查看
--galaxy
阅读排行榜
1. 从输入流中读入一行(2243)
2. sap的几道笔试题目(转)(1437)
3. 工作中发现的(1313)
4. 什么是调色板?(970)
5. Stay Hungry, Stay Foolish" (818)
6. 继续贴面试题目(708)
7. 近日复习记录(629)
8. 要读的书(522)
评论排行榜
1. 工作中发现的(3)
2. sap的几道笔试题目(转)(2)
3. 继续贴面试题目(1)
4. 从输入流中读入一行(1)
5. Stay Hungry, Stay Foolish" (1)
用一个问题探讨程序优化
题目是:找出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覆盖。
#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. 最后,变量没有初始化,是算法设计的问题。如果初始条件都没有确定,只能说明你的算法没有想清楚。
posted on 2006-03-02 22:37
笑笑生
阅读(208)
评论(0)
编辑
收藏
引用
所属分类:
C++语言
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
Effective C++
Essential C++读书笔记
深度探索c++的对象模型
理解复杂声明
一个模板巧妙技术,语法技巧
一个复杂的boost.lambda表达式的例子
C++ 编程思想学习笔记-命名控制
2005年华为招聘--C语言笔试试题
dynamic_cast详解
vc++7.1转移到vc++2005 需要的一些变动
网站导航:
博客园
IT新闻
BlogJava
博问
Chat2DB
管理
Copyright © 笑笑生
Powered by:
博客园
模板提供:
沪江博客