lemene
随笔 - 51, 文章 - 1, 评论 - 41, 引用 - 0
数据加载中……
两道程序题目
题一:
找出字符串中最长的不重复的字母子串,字串不包括数字,区分大小写。如:a123bcBdba最长的子串bcBd。
分析:只考虑实现功能,较易实现。计算以src[i]为起始字母最大不重复子串的长度,找出最长的。
char
*
max_uniq_sub(char
*
src)
{
int
i, j, t;
char
*
ret
=
0
;
int
maxlen
=
0
;
for
(i
=
0
; src[i]!
=
'
\0'; i++)
{
/*
是否为数字
*/
if
(src[i]
>=
'
0' && src[i] <= '9')
continue;
for
(j
=
i
+
1
; src[j]!
=
'
\0'; j++)
{
/*
是否为数字
*/
if
(src[j]
>=
'
0' && src[j] <= '9')
goto
next
;
/*
是否与前面的重复
*/
for
(t
=
i; t
<
j; t
++
)
{
if
(src[j]
==
src[t])
goto
next
;
}
}
next
:
/*
子串结束,是否是最长的
*/
if
(j
-
i
>
maxlen)
{
ret
=
src
+
i;
maxlen
=
j
-
i;
}
}
return ret;
}
这个算法的时间复杂度最差O(n^3),最好O(n)。最差时的例子:当字符串就是非重复子串。最好是的例子:数字字符串或者一个元素重复的字符串。
这个算法结构清晰,但有很多改进的地方。数据结构讲过一种字符串子串匹配算法,KMP算法。下面的改进算法就是吸取KMP算法的思想。子串遇到数字时和遇到相同的字母时,可以省去一些计算。
char
*
max_unqi_sub(char
*
src)
{
char
*
ret
=
0
;
int
start
=
-
1
;
/*
是否确定了子串的起始位置
*/
int
maxlen
=
0
;
int
i
=
0
, t
=
0
;
for
(i
=
0
; src[i]!
=
0
; i
++
)
{
/*
是否为数字
*/
if
(src[i]
>=
'
0' && src[i] <= '9')
{
if
(start !
=
-
1
)
/*
子串的结束位置
*/
{
if
(i
-
start
>
maxlen)
{
maxlen
=
i
-
start;
ret
=
src
+
start;
}
start
=
-
1
;
}
continue;
}
else
{
if
(start
==
-
1
)
/*
子串起始位置
*/
start
=
i;
for
(t
=
start; t
<
i; t
++
)
{
if
(src[i]
==
src[t])
/*
子串的结束位置
*/
{
if
(i
-
start
>
maxlen)
{
maxlen
=
i
-
start;
ret
=
src
+
start;
}
start
=
t
+
1
;
/*
重新确定起始位置
*/
break;
}
}
}
}
if
(i
-
start
>
maxlen)
{
maxlen
=
i
-
start;
ret
=
src
+
start;
}
return ret;
}
算法的复杂度:最差O(n^2),当字符串就是非重复子串。最好O(n),当字符串是数字字符串或者一个元素重复的字符串
题二
:一个自然数可以分解为若干个自然数相乘,求出每种分解自然数之和最少的一个。 如12=2*2*3,和为7=2+2+3
分析:如果把用穷举法把所有可能的组合计算出来,那无疑是复杂的。 假设a=b*c。其中b,c>=2。则a>=2*max{b,c}>=a+b。由此可见a因数分解后的和比a小。显然a的完全因数分解之后的和最小。问题就变成了自然数完全因数分解求和。
#include
<
math.h
>
unsigned
int
minsum(unsigned
int
n)
{
unsigned
int
sum
=
0
;
unsigned
int
div_idx
=
2
;
unsigned
int
sqrt_n
=
sqrt(n);
while
(
1
)
{
if
(div_idx
>
sqrt_n)
break;
if
(n % div_idx
==
0
)
{
sum
+=
div_idx;
n
/=
div_idx;
sqrt_n
=
sqrt(n);
}
else
div_idx
++
;
}
return sum
+
n;
}
posted on 2007-12-25 17:29
lemene
阅读(648)
评论(0)
编辑
收藏
引用
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理
Powered by:
C++博客
Copyright © lemene
导航
C++博客
首页
新随笔
联系
聚合
管理
<
2007年12月
>
日
一
二
三
四
五
六
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
5
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(4)
给我留言
查看公开留言
查看私人留言
随笔档案
2017年12月 (1)
2016年10月 (2)
2016年4月 (7)
2016年1月 (1)
2015年12月 (1)
2015年11月 (2)
2015年9月 (1)
2015年8月 (2)
2015年3月 (1)
2015年1月 (1)
2014年12月 (3)
2014年6月 (2)
2014年5月 (2)
2012年8月 (1)
2011年12月 (1)
2011年6月 (1)
2011年1月 (1)
2010年8月 (1)
2009年8月 (1)
2009年5月 (1)
2008年6月 (1)
2008年5月 (1)
2008年3月 (4)
2008年1月 (5)
2007年12月 (1)
2007年11月 (4)
2007年10月 (1)
2007年9月 (1)
文章档案
2016年4月 (1)
搜索
最新随笔
1.
2. K近邻算法
3. title
4. CPPEXP —— 构造函数抛异常
5. CPPEXP —— 构造析构函数调用顺序
6. CPPEXP —— char[]和char*的区别
7. CPPEXP —— 字符串常量
8. CPPEXP —— 字节序(大小端)
9. CPPEXP —— 类成员初始化顺序
10. CPPEXP —— 空类的大小
最新评论
1. re: CPPEXP —— char[]和char*的区别
char[]和char*的区别 mark下
--linda
2. re: VS中运行控制台程序,界面不停留[未登录]
console.readkey();
--Darren
3. re: 智力题:5个强盗分100个金币
试一下不登陆可不可以评论
--xxoo
4. re: VS2010调试断点不起作用的解决方法[未登录]
刚都可以不知动了那里,就出现断点不能调试了。
编译都是正确的。问题出在那里呢。
--liu
5. re: 计算24点[未登录]
评论内容较长,点击标题查看
--lemene
阅读排行榜
1. title(13251)
2. (11516)
3. VS2005调试断点不起作用的解决方法(8085)
4. 智力题:5个强盗分100个金币(7163)
5. 猜数字的一种解法(5234)
评论排行榜
1. 智力题:5个强盗分100个金币(10)
2. VS2005调试断点不起作用的解决方法(10)
3. 拼图游戏(6)
4. 猜数字的一种解法(5)
5. 简易统计程序运行时间的程序(3)