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
閱讀(654)
評論(0)
編輯
收藏
引用
只有注冊用戶
登錄
后才能發表評論。
【推薦】100%開源!大型工業跨平臺軟件C++源碼提供,建模,組態!
網站導航:
博客園
IT新聞
BlogJava
博問
Chat2DB
管理
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(13261)
2.?(11530)
3.?VS2005調試斷點不起作用的解決方法(8123)
4.?智力題:5個強盜分100個金幣(7211)
5.?猜數字的一種解法(5321)
評論排行榜
1.?智力題:5個強盜分100個金幣(10)
2.?VS2005調試斷點不起作用的解決方法(10)
3.?拼圖游戲(6)
4.?猜數字的一種解法(5)
5.?簡易統計程序運行時間的程序(3)
久久免费小视频
|
午夜精品久久久久久久
|
9999国产精品欧美久久久久久
|
国产一久久香蕉国产线看观看
|
久久WWW免费人成—看片
|
国产一区二区久久久
|
99久久精品国内
|
亚洲欧洲中文日韩久久AV乱码
|
伊人久久大香线蕉av一区
|
亚洲精品国产美女久久久
|
97超级碰碰碰碰久久久久
|
色欲久久久天天天综合网
|
精品久久人人爽天天玩人人妻
|
无码人妻久久一区二区三区免费丨
|
久久国产乱子伦精品免费午夜
|
国产aⅴ激情无码久久
|
久久久久国产视频电影
|
久久精品国产精品青草app
|
久久天天躁狠狠躁夜夜avapp
|
AA级片免费看视频久久
|
午夜久久久久久禁播电影
|
久久精品无码一区二区日韩AV
|
国产韩国精品一区二区三区久久
|
伊人情人综合成人久久网小说
|
亚洲一本综合久久
|
99999久久久久久亚洲
|
久久综合噜噜激激的五月天
|
尹人香蕉久久99天天拍
|
久久精品国产精品亚洲人人
|
91久久成人免费
|
国产一级持黄大片99久久
|
国产亚洲精品美女久久久
|
无码人妻久久久一区二区三区
|
久久丫忘忧草产品
|
中文字幕无码久久人妻
|
欧美一级久久久久久久大片
|
久久人人爽人人爽AV片
|
亚洲精品高清一二区久久
|
无码精品久久一区二区三区
|
一本大道久久东京热无码AV
|
欧美日韩精品久久免费
|