給定九個數,例如:1,3,3,5,6,7,8,8,9計算出這九個數的排列的種數。需要考慮重復情況,如果給定9個1,則只有一種結果。
限制:不能使用stl庫
要求:完成函數 unsigned int foo(unsigned int *arr);
輸入算法代碼,并給出算法復雜度分析。
分析:
#include <cstdlib>
#include <iostream>
using namespace std;
unsigned int foo(unsigned int *arr)
{
unsigned int p[] ={1,2,6,24,120,720,5040,40320,362880};
unsigned int i,j,c,s=p[8];//first the number is p99
for(i = 0; i < 7; i++)
for(j = i+1; j < 8; j++)
{
if(arr[i]>arr[j]) //swap two number
{
arr[i]^=arr[j];
arr[j]^=arr[i];
arr[i]^=arr[j];
}
}
i = 0;
c = 0;
while(i<8)
{
j = i+1;
while(arr[i]==arr[j])//compute the number of the repetition
{
c++;
j++;
}
s/=p[c];
c=0;
i=j;
}
return s;
}
int main()
{
unsigned int a[]={1,3,3,5,6,7,8,8,9};
cout<<"The number of permutation is: "<<foo(a)<<endl;
system("pause");
return 0;
}
還可以改進排序那部分。
轉一個經典的題目:
給一個天平,問如何用3次把這個小球找出來
并且求出這個小球是比其他的輕還是重
將12個球分別編號為a1,a2,a3.......a10,a11,a12.
第一步:將12球分開3撥,每撥4個,a1~a4第一撥,記為b1, a5~a8第2撥,記為b2,其余第3撥,記為b3;
第二步:將b1和b2放到天平兩盤上,記左盤為c1,右為c2;這時候分兩中情況:
1.c1和c2平衡,此時可以確定從a1到a8都是常球;然后把c2拿空,并從c1上拿下a4,從a9到a12四球里隨便取三球,假設為a9到a11,放到c2上。此時c1上是a1到a3,c2上是a9到a11。從這里又分三種情況:
A:天平平衡,很簡單,說明沒有放上去的a12就是異球,而到此步一共稱了兩次,所以將a12隨便跟11個常球再稱一次,也就是第三次,馬上就可以確定a12是重還是輕;
B:若c1上升,則這次稱說明異球為a9到a11三球中的一個,而且是比常球重。取下c1所有的球,并將a8放到c1上,將a9取下,比較a8和a11(第三次稱),如果平衡則說明從c2上取下的a9是偏重異球,如果不平衡,則偏向哪盤則哪盤里放的就是偏重異球;
C:若c1下降,說明a9到a11里有一個是偏輕異球。次種情況和B類似,所以接下來的步驟照搬B就是;
2.c1和c2不平衡,這時候又分兩種情況,c1上升和c1下降,但是不管哪種情況都能說明a9到a12是常球。這步是解題的關鍵。也是這個題最妙的地方。
A:c1上升,此時不能判斷異球在哪盤也不能判斷是輕還是重。取下c1中的a2到a4三球放一邊,將c2中的a5和a6放到c1上,然后將常球a9放到c2上。至此,c1上是a1,a5和a6,c2上是a7,a8和a9。此時又分三中情況:
1)如果平衡,說明天平上所有的球都是常球,異球在從c1上取下a2到a4中。而且可以斷定異球輕重。因為a5到a8都是常球,而第2次稱的時候c1是上升的,所以a2到a4里必然有一個輕球。那么第三次稱就用來從a2到a4中找到輕球。這很簡單,隨便拿兩球放到c1和c2,平衡則剩余的為要找球,不平衡則哪邊低則哪個為要找球;
2)c1仍然保持上升,則說明要么a1是要找的輕球,要么a7和a8兩球中有一個是重球(這步懂吧?好好想想,很簡單的。因為a9是常球,而取下的a2到a4肯定也是常球,還可以推出換盤放置的a5和a6也是常球。所以要么a1輕,要么a7或a8重)。至此,還剩一次稱的機會。只需把a7和a8放上兩盤,平衡則說明a1是要找的偏輕異球,如果不平衡,則哪邊高說明哪個是偏重異球;
3)如果換球稱第2次后天平平衡打破,并且c1降低了,這說明異球肯定在換過來的a5和a6兩求中,并且異球偏重,否則天平要么平衡要么保持c1上升。確定要找球是偏重之后,將a5和a6放到兩盤上稱第3次根據哪邊高可以判定a5和a6哪個是重球;
B:第1次稱后c1是下降的,此時可以將c1看成c2,其實以后的步驟都同A,所以就不必要再重復敘述了。至此,不管情況如何,用且只用三次就能稱出12個外觀手感一模一樣的小球中有質量不同于其他11球的偏常的球。而且在稱的過程中可以判定其是偏輕還是偏重。
3.U2 合唱團在17 分鐘內得趕到演唱會場,途中必需跨過一座橋,四個人從橋的同一端出發,你得幫助他們到達另一端,天色很暗,而他們只有一只手電筒。一次同時最多可以有兩人一起過橋,而過橋的時候必須持有手電筒,所以就得有人把手電筒帶來帶去,來回橋兩端。手電筒是不能用丟的方式來傳遞的。四個人的步行速度各不同,若兩人同行則以較慢者的速度為準。Bono 需花1 分鐘過橋,Edge 需花2 分鐘過橋,Adam需花 5 分鐘過橋,Larry 需花10 分鐘過橋。他們要如何在17 分鐘內過橋呢?(有個同濟的學生寫文章說他當時在微軟面試時就是碰到了這道題,最短只能做出在19分鐘內過橋,微軟的人對他講這樣的結果已經是不錯的了!)
A點到 B 點
1 和2 過去 2 分鐘 2
2 過來 4 分鐘 2+2=4
10和 5過去 14 分鐘 4+10=14
1 過來 15 分鐘 14+1=15
1 和2 過去 17 分鐘 15+2=17
第一組
1.燒一根不均勻的繩,從頭燒到尾總共需要1個小時。現在有若干條材質相同的繩子,問如何用燒繩的方法來計時一個小時十五分鐘呢?
ans:三根繩,開始的時候,第一根點燃兩端,第二根點燃一端,第三根不點。第一根繩燒完(30分鐘)后,點燃第二根繩的另一端,第二根只要15分鐘就可以燒完了,第二根繩燒完(45分鐘)后,點燃第三根繩子兩端,第三根繩燒完(1小時15分)后,計時完成
2.你有一桶果凍,其中有黃色、綠色、紅色三種,閉上眼睛抓取同種顏色的兩個。抓取多少個就可以確定你肯定有兩個同一顏色的果凍?
3.如果你有無窮多的水,一個3公升的提捅,一個5公升的提捅,兩只提捅形狀上下都不均勻,問你如何才能準確稱出4公升的水?
4.一個岔路口分別通向誠實國和說謊國。來了兩個人,已知一個是誠實國的,另一個是說謊國的。誠實國永遠說實話,說謊國永遠說謊話。現在你要去說謊國,但不知道應該走哪條路,需要問這兩個人。請問應該怎么問?
5.12個球一個天平,現知道只有一個和其它的重量不同,問怎樣稱才能用三次就找到那個球。13個呢?(注意此題并未說明那個球的重量是輕是重,所以需要仔細考慮)
6.在9個點上畫10條直線,要求每條直線上至少有三個點?
7.在一天的24小時之中,時鐘的時針、分針和秒針完全重合在一起的時候有幾次?都分別是什么時間?你怎樣算出來的?
8.怎么樣種植4棵樹木,使其中任意兩棵樹的距離相等?
第二組
1.為什么下水道的蓋子是圓的?
2.中國有多少輛汽車?
3.將汽車鑰匙插入車門,向哪個方向旋轉就可以打開車鎖?
4.如果你要去掉中國的34個省(含自治區、直轄市和港澳特區及臺灣省)中的任何一個,你會去掉哪一個,為什么?
5.多少個加油站才能滿足中國的所有汽車?
6.想象你站在鏡子前,請問,為什么鏡子中的影象可以顛倒左右,卻不能顛倒上下?
7.為什么在任何旅館里,你打開熱水,熱水都會瞬間傾瀉而出?
8.你怎樣將Excel的用法解釋給你的奶奶聽?
9.你怎樣重新改進和設計一個ATM銀行自動取款機?
10.如果你不得不重新學習一種新的計算機語言,你打算怎樣著手來開始?
11.如果你的生涯規劃中打算在5年內受到獎勵,那獲取該項獎勵的動機是什么?觀眾是誰?
12.如果微軟告訴你,我們打算投資五百萬美元來啟動你的投資計劃,你將開始什么樣商業計劃?為什么?
13.如果你能夠將全世界的電腦廠商集合在一個辦公室里,然后告訴他們將被強迫做一件事,那件事將是什么?
第三組
1.你讓工人為你工作7天,回報是一根金條,這個金條平分成相連的7段,你必須在每天結束的時候給他們一段金條。如果只允許你兩次把金條弄斷,你如何給你的工人付費?
2.有一輛火車以每小時15公里的速度離開北京直奔廣州,同時另一輛火車每小時20公里的速度從廣州開往北京。如果有一只鳥,以30公里每小時的速度和兩輛火車同時啟動,從北京出發,碰到另一輛車后就向相反的方向返回去飛,就這樣依次在兩輛火車之間來回地飛,直到兩輛火車相遇。請問,這只鳥共飛行了多長的距離?
3.你有四個裝藥丸的罐子,每個藥丸都有一定的重量,被污染的藥丸是沒被污染的藥丸的重量+1。只稱量一次,如何判斷哪個罐子的藥被污染了?
4.門外三個開關分別對應室內三盞燈,線路良好,在門外控制開關時候不能看到室內燈的情況,現在只允許進門一次,確定開關和燈的對應關系?
5.人民幣為什么只有1、2、5、10的面值?
6.你有兩個罐子以及50個紅色彈球和50個藍色彈球,隨機選出一個罐子, 隨機選出一個彈球放入罐子,怎么給出紅色彈球最大的選中機會?在你的計劃里,得到紅球的幾率是多少?
7.給你兩顆6面色子,可以在它們各個面上刻上0-9任意一個數字,要求能夠用它們拼出任意一年中的日期數值
第四組
第一題 . 五個海盜搶到了100顆寶石,每一顆都一樣大小和價值連城。他們決定這么分:
抽簽決定自己的號碼(1、2、3、4、5)
首先,由1號提出分配方案,然后大家表決,當且僅當超過半數的人同意時,按照他的方案
進行分配,否則將被扔進大海喂鯊魚
如果1號死后,再由2號提出分配方案,然后剩下的4人進行表決,當且僅當超過半數的人同
意時,按照他的方案進行分配,否則將被扔入大海喂鯊魚
依此類推
條件:每個海盜都是很聰明的人,都能很理智地做出判斷,從而做出選擇。
問題:第一個海盜提出怎樣的分配方案才能使自己的收益最大化?
第二題 . 一道關于飛機加油的問題,已知:
每個飛機只有一個油箱,
飛機之間可以相互加油(注意是相互,沒有加油機)
一箱油可供一架飛機繞地球飛半圈,
問題:
為使至少一架飛機繞地球一圈回到起飛時的飛機場,至少需要出動幾架飛機?(所有飛機從同一機場起飛,而且必須安全返回機場,不允許中途降落,中間沒有飛機場)第三題. 汽車加油問題
一輛載油500升的汽車從A開往1000公里外的B,已知汽車每公里耗油量為1升,A處有無窮多的油,其他任何地點都沒有油,但該車可以在任何地點存放油以備中轉,問從A到B最少需要多少油
第四題. 擲杯問題
一種杯子,若在第N層被摔破,則在任何比N高的樓層均會破,若在第M層不破,則在任何比M低的樓層均會破,給你兩個這樣的杯子,讓你在100層高的樓層中測試,要求用最少的測試次數找出恰巧會使杯子破碎的樓層。
第五題. 推理游戲
教授選出兩個從2到9的數,把它們的和告訴學生甲,把它們的積告訴學生乙,讓他們輪流猜這兩個數
甲說:“我猜不出”
乙說:“我猜不出”
甲說:“我猜到了”
乙說:“我也猜到了”
問這兩個數是多少
第六題. 病狗問題
一個住宅區內有100戶人家,每戶人家養一條狗,每天傍晚大家都在同一個地方遛狗。已知這些狗中有一部分病狗,由于某種原因,狗的主人無法判斷自己的狗是否是病狗,卻能夠分辨其他的狗是否有病,現在,上級傳來通知,要求住戶處決這些病狗,并且不允許指認他人的狗是病狗(就是只能判斷自己的),過了7天之后,所有的病狗都被處決了,問,一共有幾只病狗?為什么?
第八題. 監獄里有100個房間,每個房間內有一囚犯。一天,監獄長說,你們獄房外有一電燈,你們在放風時可以控制這個電燈(熄或亮)。每天只能有一個人出來放風,并且防風是隨機的。如果在有限時間內,你們中的某人能對我說:“我敢保證,現在每個人都已經至少放過一次風了。”我就放了你們!問囚犯們要采取什么策略才能被監獄長放掉?如果采用了這種策略,大致多久他們可以被釋放?
第五組
1.某手機廠家由于設計失誤,有可能造成電池壽命比原來設計的壽命短一半(不是沖放電時間),解決方案就是免費更換電池或給50元購買該廠家新手機的折換券。請給所有已購買的用戶寫信告訴解決方案。
2.一高層領導在參觀某博物館時,向博物館館員小王要了一塊明代的城磚作為紀念,按國家規定,任何人不得將博物館收藏品變為私有。博物館館長需要如何寫信給這位領導,將城磚取回。
3.營業員小姐由于工作失誤,將2萬元的筆記本電腦以1.2萬元錯賣給李先生,王小姐的經理怎么寫信給李先生試圖將錢要回來?
4.給你一款新研制的手機,如果你是測試組的組長,你會如何測試?
5.如何為函數int atoi(const char * pstr)編寫測試向量?
第六組
1.鏈表和數組的區別在哪里?
2.編寫實現鏈表排序的一種算法。說明為什么你會選擇用這樣的方法?
3.編寫實現數組排序的一種算法。說明為什么你會選擇用這樣的方法?
4.請編寫能直接實現char * strcpy(char * pstrDest,const char * pstrSource)函數功能的代碼。
5.編寫反轉字符串的程序,要求優化速度、優化空間。
6.在鏈表里如何發現循環鏈接?
7.給出洗牌的一個算法,并將洗好的牌存儲在一個整形數組里。
8.寫一個函數,檢查字符是否是整數,如果是,返回其整數值。(或者:怎樣只用4行代碼
9.給出一個函數來輸出一個字符串的所有排列。
10.請編寫實現void * malloc(int)內存分配函數功能一樣的代碼。
11.給出一個函數來復制兩個字符串A和B。字符串A的后幾個字節和字符串B的前幾個字節重疊。
12.怎樣編寫一個程序,把一個有序整數數組放到二叉樹中?
13.怎樣從頂部開始逐層打印二叉樹結點數據?請編程。
14.怎樣把一個鏈表掉個順序(也就是反序,注意鏈表的邊界條件并考慮空鏈表)? --
15.請編寫能直接實現int atoi(const char * pstr)函數功能的代碼
-----------------------------------------------------------------------------------
第一組題答案:
2)根據抽屜原理,4個
3)3升裝滿;3升-〉5升(全注入);3升裝滿;3升-〉5升(剩1升);5升倒掉;3升-〉5升(注入1升);3升裝滿;3升-〉5升;完成(另:可用回溯法編程求解)
4)問其中一人:另外一個人會說哪一條路是通往誠實國的?回答者所指的那條路必然是通往說謊國的。
5)12個球:
第一次:4,4 如果平了:
那么剩下的球中取3放左邊,取3個好球放右邊,稱:
如果左邊重,那么取兩個球稱一下,哪個重哪個是次品,平的話第三個重,是次品,輕的話同理
如果平了,那么剩下一個次品,還可根據需要稱出次品比正品輕或者重
如果不平:
那么不妨設左邊重右邊輕,為了便于說明,將左邊4顆稱為重球,右邊4顆稱為輕球,剩下4顆稱為好球
取重球2顆,輕球2顆放在左側,右側放3顆好球和一顆輕球
如果左邊重
稱那兩顆重球,重的一個次品,平的話右邊輕球次品
如果右邊重
稱左邊兩顆輕球,輕的一個次品
如果平
稱剩下兩顆重球,重的一個次品,平的話剩下那顆輕球次品
13個球:
第一次:4,4,如果平了
剩5顆球用上面的方法仍舊能找出次品,只是不能知道次品是重是輕
如果不平,同上
6)
o o o
o o o
o o o
7)
23次,因為分針要轉24圈,時針才能轉1圈,而分針和時針重合兩次之間的間隔顯然>1小時,它們有23次重合機會,每次重合中秒針有一次重合機會,所以是23次
重合時間可以對照手表求出,也可列方程求出
8)
在地球表面種樹,做一個地球內接的正四面體,內接點即為所求
第二組 無標準答案
第三組
1. 分成1,2,4三段,第一天給1,第二天給2取回1,第3天給1,第4天給4取回1、2,第5天給1,第6天給2取回1,第七天給1
2. 求出火車相遇時間,鳥速乘以時間就是鳥飛行的距離
3. 四個罐子中分別取1,2,3,4顆藥丸,稱出比正常重多少,即可判斷出那個罐子的藥被污染
4. 三個開關分別:關,開,開10分鐘,然后進屋,暗且涼的為開關1控制的燈,亮的為開關2控制的燈,暗且熱的為開關3控制的燈
5. 因為可以用1,2,5,10組合成任何需要的貨幣值,日常習慣為10進制
6. 題意不理解...*_*
7. 012345 0126(9)78
第四組 都是很難的題目
第一題:97 0 1 2 0 或者 97 0 1 0 2 (提示:可用逆推法求出)
第二題:3架飛機5架次,飛法:
ABC 3架同時起飛,1/8處,C給AB加滿油,C返航,1/4處,B給A加滿油,B返航,A到達1/2處,C從機場往另一方向起飛,3/4處,C同已經空油箱的A平分剩余油量,同時B從機場起飛,AC到7/8處同B平分剩余油量,剛好3架飛機同時返航。所以是3架飛機5架次。第三題:需要建立數學模型
(提示,嚴格證明該模型最優比較麻煩,但確實可證,大膽猜想是解題關鍵)
題目可歸結為求數列 an=500/(2n+1) n=0,1,2,3......的和Sn什么時候大于等于1000,解得n>6
當n=6時,S6=977.57
所以第一個中轉點離起始位置距離為1000-977.57=22.43公里
所以第一次中轉之前共耗油 22.43*(2*7+1)=336.50升
此后每次中轉耗油500升
所以總耗油量為7*500+336.50=3836.50升
第四題:需要建立數學模型
題目可歸結為求自然數列的和S什么時候大于等于100,解得n>13
第一個杯子可能的投擲樓層分別為:14,27,39,50,60,69,77,84,90,95,99,100
第五題:3和4(可嚴格證明)
設兩個數為n1,n2,n1>=n2,甲聽到的數為n=n1+n2,乙聽到的數為m=n1*n2
證明n1=3,n2=4是唯一解
證明:要證以上命題為真,不妨先證n=7
1)必要性:
i) n>5 是顯然的,因為n<4不可能,n=4或者n=5甲都不可能回答不知道
ii) n>6 因為如果n=6的話,那么甲雖然不知道(不確定2+4還是3+3)但是無論是2,4還是3,3乙都不可能說不知道(m=8或者m=9的話乙說不知道是沒有道理的)
iii) n<8 因為如果n>=8的話,就可以將n分解成 n=4+x 和 n=6+(x-2),那么m可以是4x也可以是6(x-2)而4x=6(x-2)的必要條件是x=6即n=10,那樣n又可以分解成8+2,所以總之當n>=8時,n至少可以分解成兩種不同的合數之和,這樣乙說不知道的時候,甲就沒有理由馬上說知道。
以上證明了必要性
2)充分性
當n=7時,n可以分解成2+5或3+4
顯然2+5不符合題意,舍去,容易判斷出3+4符合題意,m=12,證畢
于是得到n=7 m=12 n1=3 n2=4是唯一解。第六題:7只(數學歸納法證明)
1)若只有1只病狗,因為病狗主人看不到有其他病狗,必然會知道自己的狗是病狗(前提是一定存在病狗),所以他會在第一天把病狗處決。
2)設有k只病狗的話,會在第k天被處決,那么,如果有k+1只,病狗的主人只會看到k只病狗,而第k天沒有人處決病狗,病狗主人就會在第k+1天知道自己的狗是病狗,于是病狗在第k+1天被處決
3)由1)2)得,若有n只病狗,必然在第n天被處決
第八題:
約定好一個人作為報告人(可以是第一個放風的人)
規則如下:
1、報告人放風的時候開燈并數開燈次數
2、其他人第一次遇到開著燈放風時,將燈關閉
3、當報告人第100次開燈的時候,去向監獄長報告,要求監獄長放人......
按照概率大約30年后(10000天)他們可以被釋放
第五組無標準答案
第六組部分題參考答案:
4.
char * strcpy(char * pstrDest,const char * pstrSource)
{
assert((pstrDest!=NULL)&&(pstrSource!=NULL));
char * pstr=pstrDest;
while((*(pstrDest++)=*(pstrSource++))!='\0');
return pstr;
}
5.
char * strrev(char * pstr)
{
assert(pstr!=NULL);
char * p=pstr;
char * pret=pstr;
while(*(p++)!='\0');
p--;
char tmp;
while(p>pstr)
{
tmp=*p;
*(p--)=*(pstr);
*(pstr++)=tmp;
}
return pret;
百度筆試題:
IP段格式:ip1 ip2。之間以空格分開,ip形式為X.X.X.X,數據保存在文件中,文件不超過2k行,無序。現在要求編寫算法去掉可重IP,可重有三種形式:包含、交疊、緊靠。
例如,文件內容為:
10.0.0.0 10.0.0.12
10.0.0.5 10.0.0.10 ( <= 包含)
10.0.0.8 10.0.0.15 ( <= 交疊)
10.0.0.15 10.0.0.24 ( <= 緊靠)
最后輸出為:
10.0.0.0 10.0.0.24
code:
/*
**這個函數的作用是將文件中的一行對應的兩個數據轉換成整形的數據
**比如把10.0.0.0 10.0.0.12 轉換后,left=10*224,就是10.0.0.0對應的整數,每個數字對應8位,right=left+12
*/
void ParseLine( char line[], size_t length, unsigned int &left, unsigned int &right)
{
size_t i;
for( i=0; i<length; i++ )
{
if ( line[i]=='.' || line[i]==' ' )//將點變成0
{
line[i]=0;
}
}
char *p = (char*)&left;
char *num = line;
for( i=3; i<4; --i ) //size是size_t,而size_t是unsigned int,所以i=0再自減后變成了最大的整數,循環就會終止
{
// cout<<i<<",";
*(p+i) = strtol( num, &num ,10 );
cout<<static_cast<int>(*(p+i))<<",";
++num;
// cout<<num<<":";
}
cout<<endl;
p = (char*)&right;
for( i=3; i<4; --i )
{
*(p+i) = strtol( num, &num, 10 );
++num;
}
}
void UniqueSequence( vector<unsigned int> & uSeq, unsigned int left, unsigned int right )
{
size_t i, lPos=-1, rPos=-1;
for( i=0; i<uSeq.size(); i++ )
{
if( left <= uSeq.at(i) )
{
lPos = i;
break;
}
}
for( ;i<uSeq.size(); i++ )
{
if( right<=uSeq.at(i) )
{
rPos=i;
break;
}
}
if( lPos == -1 )
{
uSeq.push_back( left );
uSeq.push_back( right );
return;
}
if( lPos%2 == 0 )
{
if( uSeq.at(lPos)==left )
{
}
else
{
uSeq.insert( uSeq.begin()+lPos, left );
}
}
else
{
--lPos;
}
if( rPos == -1 )
{
uSeq.erase( uSeq.begin()+(lPos+1), uSeq.end() );
uSeq.push_back(right);
}
else if( rPos%2 == 0 )
{
if( uSeq.at(rPos)== right )
{
uSeq.erase( uSeq.begin()+(lPos+1), uSeq.begin()+(rPos+1) );
}
else
{
uSeq.erase( uSeq.begin()+(lPos+1), uSeq.begin()+rPos );
uSeq.insert( uSeq.begin()+rPos, right );
}
}
else
{
uSeq.erase( uSeq.begin()+(lPos+1), uSeq.begin()+rPos );
}
}
void PrintIP( unsigned int num )
{
char *p = (char*)#
for( size_t i=3;i>0; --i)
{
cout<< (int)p[i]<<".";
}
cout<<(int)p[0];
}
#define MAX_BUFFER_LENGTH 100
int main()
{
unsigned int left, right;
char buffer[MAX_BUFFER_LENGTH];
ifstream infile( "test.txt" );
if( infile.fail() )
{
return 0;
}
vector<unsigned int> uSeq;
while( infile.getline(buffer, MAX_BUFFER_LENGTH) )
{
ParseLine(buffer, strlen(buffer), left, right);
// cout<<left<<","<<right<<endl;
UniqueSequence( uSeq, left, right );
for( size_t i=0; i<uSeq.size(); i+=2 )
{
PrintIP(uSeq.at(i) );
cout<<" ";
PrintIP(uSeq.at(i+1));
cout<<endl;
}
cout<<endl;
}
for( size_t i=0; i<uSeq.size(); i+=2 )
{
PrintIP(uSeq.at(i) );
cout<<" ";
PrintIP(uSeq.at(i+1));
cout<<endl;
}
return 0;
}
/*long strtol( const char *nptr, char **endptr, int base ),其中nptr是以NULL結尾字符串,endptr是字符串停止掃描的地方(Pointer to character that stops scan),strtol returns the value represented in the string nptr,The strtol function converts nptr to a long. strtol stops reading the string nptr at the first character it cannot recognize as part of a number. This may be the terminating null character, or it may be the first numeric character greater than or equal to base.
string = "-10110134932This stopped it";
l = strtol( string, &stopstring, 10 );
printf( "string = %s", string );
printf(" strtol = %ld", l );
printf(" Stopped scan at: %s", stopstring );
string = "10110134932";
printf( "string = %s\n", string );
/* Convert string using base 2, 4, and 8: */
for( base = 2; base <= 8; base *= 2 )
{
/* Convert the string: */
ul = strtoul( string, &stopstring, base );
printf( " strtol = %ld (base %d)\n", ul, base );
printf( " Stopped scan at: %s\n", stopstring );
}
打印的結果是:
string = -10110134932This stopped it strtol = -2147483647 Stopped scan at: This stopped itstring = 10110134932
strtol = 45 (base 2)
Stopped scan at: 34932
strtol = 4423 (base 4)
Stopped scan at: 4932
strtol = 2134108 (base 8)
Stopped scan at: 932
*/
5.如果存在兩個變量:a和b,不使用“if”、“?:”、 “switch”和其它的判斷語句,找出兩個數中的最大值。
答案:( ( a + b ) + abs( a - b ) ) / 2
6. 寫一個函數找出一個整數數組中,第二大的數 (microsoft)
const int MINNUMBER = -32767 ;
int find_sec_max( int data[] , int count)
{
int maxnumber = data[0] ;
int sec_max = MINNUMBER ;
for ( int i = 1 ; i < count ; i++)
{
if ( data[i] > maxnumber )
{
sec_max = maxnumber ;
maxnumber = data[i] ;
}
else
{
if ( data[i] > sec_max )
sec_max = data[i] ;
}
}
return sec_max ;
}