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
閱讀(652)
評論(0)
編輯
收藏
引用
只有注冊用戶
登錄
后才能發表評論。
【推薦】100%開源!大型工業跨平臺軟件C++源碼提供,建模,組態!
網站導航:
博客園
IT新聞
BlogJava
博問
Chat2DB
管理
Powered by:
C++博客
Copyright © lemene
導航
C++博客
首頁
新隨筆
聯系
聚合
管理
<
2015年1月
>
日
一
二
三
四
五
六
28
29
30
31
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
6
7
常用鏈接
我的隨筆
我的評論
我參與的隨筆
留言簿
(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(13257)
2.?(11526)
3.?VS2005調試斷點不起作用的解決方法(8110)
4.?智力題:5個強盜分100個金幣(7198)
5.?猜數字的一種解法(5290)
評論排行榜
1.?智力題:5個強盜分100個金幣(10)
2.?VS2005調試斷點不起作用的解決方法(10)
3.?拼圖游戲(6)
4.?猜數字的一種解法(5)
5.?簡易統計程序運行時間的程序(3)
国产精品成人久久久久三级午夜电影
|
久久久久综合国产欧美一区二区
|
精品久久久久久久无码
|
久久精品国产亚洲av麻豆小说
|
精品熟女少妇a∨免费久久
|
一级做a爰片久久毛片16
|
亚洲国产精品无码久久久久久曰
|
久久夜色精品国产欧美乱
|
91精品国产色综久久
|
伊人久久大香线蕉亚洲五月天
|
久久精品成人国产午夜
|
久久人人爽人人爽人人片AV麻烦
|
久久久久久久久无码精品亚洲日韩
|
99久久综合国产精品免费
|
72种姿势欧美久久久久大黄蕉
|
久久久人妻精品无码一区
|
人妻精品久久久久中文字幕69
|
亚洲AV日韩精品久久久久久久
|
久久国产亚洲精品
|
中文无码久久精品
|
亚洲成人精品久久
|
97久久国产露脸精品国产
|
国产女人aaa级久久久级
|
国产精品一久久香蕉国产线看观看
|
久久人人爽人人澡人人高潮AV
|
久久天天躁狠狠躁夜夜躁2O2O
|
国产精品一区二区久久
|
国产精品99久久久久久宅男小说
|
国产激情久久久久影院老熟女
|
久久综合九色综合网站
|
久久人人爽人人爽人人爽
|
久久中文精品无码中文字幕
|
一本色道久久88加勒比—综合
|
久久国产色AV免费看
|
激情伊人五月天久久综合
|
久久人人爽人人爽人人片AV不
|
久久亚洲AV无码精品色午夜麻豆
|
久久天天躁狠狠躁夜夜2020
|
精品久久久久中文字
|
久久亚洲精品无码播放
|
久久久久无码专区亚洲av
|