算法面試題及答案_第1頁
算法面試題及答案_第2頁
算法面試題及答案_第3頁
算法面試題及答案_第4頁
算法面試題及答案_第5頁
已閱讀5頁,還剩42頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

時針分針重合幾次表面上有60個小格,每小格代表一分鐘,時針每分鐘走1/12小格,分針每分鐘走1小格,從第一次重合到第二次重合分針比時針多走一圈即60小格,所以60/(1-1/12)=720/11每隔720/11分才重合一次(而并不是每小時重合一次)1440里有22個720/11,如果說算上0點和24點,那也是重合23次而已,但我覺得0點應該算到前一天的24點頭上,所以每一天循環(huán)下來重合22次啊找出字符串的最長不重復子串,輸出長度建一個256個單元的數(shù)組,每一個單元代表一個字符,數(shù)組中保存上次該字符上次出現(xiàn)的位置;依次讀入字符串,同時維護數(shù)組的值;如果遇到?jīng)_突了,就返回沖突字符中保存的位置,繼續(xù)第二步。也可以用hashmap保存已經(jīng)出現(xiàn)的字符和字符的位置說是有一個文本文件,大約有一萬行,每行一個詞,要求統(tǒng)計出其中最頻繁出先用哈希,統(tǒng)計每個詞出現(xiàn)的次數(shù),然后在用在N個數(shù)中找出前K大個數(shù)的方法找出出現(xiàn)次數(shù)最多的前10個詞。如題3,但是車次文件特別大,沒有辦法一次讀入內(nèi)存。直接排序,寫文件時,同時寫入字符串及其出現(xiàn)次數(shù)??梢杂霉#热缦雀鶕?jù)字符串的第一個字符將字符串換分為多個區(qū)域,每個區(qū)域的字符串寫到一個文件內(nèi),然后再用哈希+堆統(tǒng)計每個區(qū)域內(nèi)前10個頻率最高的字符串,最后求出所有字符串中前10個頻率最高的字符串。有一個整數(shù)n,將n分解成若干個整數(shù)之和,問如何分解能使這些數(shù)的乘積最大,輸出這個乘積m。例如:n=12分解為1+1+1+???+1,12個1,m=1*1*1……*1=1分解為2+2+???+2,6個2, m=64分解為3+3+3+3,4個3, m=81大于等于4時分解時只能分解為2和3,且2最多兩個f(n)=3*f(n-3)n>4f(4)=2*2f(3)=3f(2)=2分解為4+4+4,3個4, m=64求數(shù)組n中出現(xiàn)次數(shù)超過一半的數(shù)把數(shù)組分成[n/2]組,則至少有一組包含重復的數(shù),因為如果無重復數(shù),則最多只有出現(xiàn)次數(shù)等于一半的數(shù)。算法如下:k<-n;whilek>3do把數(shù)組分成[k/2]組;fori=1to[k/2]do???if組內(nèi)2個數(shù)相同,則任取一個數(shù)留下;???else2個數(shù)同時扔掉;k〈-剩下的數(shù)ifk=3???then任取2個數(shù)進行比較;????if兩個數(shù)不同,則2個數(shù)都扔掉????else任取一個數(shù)???ifk=2or1then任取一數(shù)A文件中最多有n個正整數(shù),而且每個數(shù)均小于n,n<=10的七次方。不會出現(xiàn)重復的數(shù)。要求對A文件中的數(shù)進行排序,可用內(nèi)存為1M,磁盤可用空間足夠。程師應有的素質(zhì),題目給的很有分寸:n個數(shù),都小于n,兩兩不同,1M=1O飛byte=10“7bit的內(nèi)存,n〈10八7思路:把1M內(nèi)存看作是一個長度為10八7的位數(shù)組,每一位都初始化為0從頭掃描n個數(shù),如果碰到i,就把位數(shù)組的第i個位置置為1,1M內(nèi)存有點少,(1M二8Mbits),可以代表8M整數(shù),現(xiàn)在n<=10的七次方,你可以讀2遍文件,就可以完成排序了。第一次排n〈8M得數(shù),第2遍排8M<=""div二""style二"word-wrap:break-word;">有10億個雜亂無章的數(shù),怎樣最快地求出其中前1000大的數(shù)。建一個1000個數(shù)的堆,復雜度為N*(log1000)=10N1.用每一個BIT標識一個整數(shù)的存在與否,這樣一個字節(jié)可以標識8個整數(shù)的存在與否,對于所有32位的整數(shù),需要512Mb,所以開辟一個512Mb的字符數(shù)組A,初始全0??2.依次讀取每個數(shù)n,將A[n>>3]設置為A[n>>3]|(1〈〈=〃〃div二〃〃style二〃word-wrap:break-word;">??3.在A中,從大到小讀取1000個值為1的數(shù),就是最大的1000個數(shù)了。的方法了。一棵樹節(jié)點1,2,3,...,n.怎樣實現(xiàn):先進行0(n)預處理,然后任給兩個節(jié)點,用0(1)判斷它們的父子關系dfs一遍,記錄每個結點的開始訪問時間Si和結束訪問時間Ei對于兩個節(jié)點i,j,若區(qū)間[Si,Ei]包含[Sj,Ej],則i是j的祖先。給每個節(jié)點哈夫曼編碼也行,但只適合一般的二叉樹,而實際問題未必是Binary的,所以編碼有局限性給定一個二叉樹,求其中N(N>=2)個節(jié)點的最近公共祖先節(jié)點。每個節(jié)點只有左右孩子指針,沒有父指針。后序遞歸給每個節(jié)點打分,每個節(jié)點的分數(shù)二左分數(shù)+右分數(shù)+k,如果某孩子是給定節(jié)點則+1最深的得分為N的節(jié)點就是所求吧,細節(jié)上應該不用遞歸結束就可以得到這個節(jié)點如何打印如下的螺旋隊列:21 22oooo2078910196121118543121716151413#include#definemax(a,b)((a)<(b)(b):(a))#defineabs(a)((a)>0(a):-(a))intfoo(intx,inty){intt二max(abs(x),abs(y));intu二t+t;intv二u-1;v=v*v+u;if(x==-t)???v+=u+t-y;elseif(y==-t)???v+=3*u+x-t;elseif(y==t)???v+=t-x;else??????v+=y-t;returnv;}intmain()intx,y;for(y=-2;y〈=2;y++){???for(x=-2;x<=2;x++)????printf("%5d",foo(x,y));???printf("\n");}return0;}第0層規(guī)定為中間的那個1,第1層為2到9,第2層為10到25,……好像看出一點名堂來了注意到1、9、25、……不就是平方數(shù)嗎而且是連續(xù)奇數(shù)(1、3、5、……)的平方數(shù)。這些數(shù)還跟層數(shù)相關,推算一下就可以知道第t層之內(nèi)一共有(2t-1廠2個數(shù),因而第t層會從[(21-1廠2]+1開始繼續(xù)往外螺旋。給定坐標(x,y),如何知道該點處于第幾層soeasy,層數(shù)t二max(|x|,|y|)。知道了層數(shù),接下來就好辦多了,這時我們就知道所求的那點一定在第t層這個圈上,順著往下數(shù)就是了。要注意的就是螺旋隊列數(shù)值增長方向和坐標軸正方向并不一定相同。我們可以分成四種情況一一上、下、左、右 或者東、南、西、北,分別處于四條邊上來分析。東丨右:x==t,隊列增長方向和y軸一致,正東方向(y二0)數(shù)值為(2t-l)2+t,所以v二(2t-l)2+t+y南丨下:y二二t,隊列增長方向和x軸相反,正南方向(x=0)數(shù)值為(2t-l)2+3t,所以v=(2t-1)2+3t-x西丨左:x==-t,隊列增長方向和y軸相反,正西方向(y=0)數(shù)值為(2t-1)2+5t,所以v二(2t-1)2+5t-y北丨上:y二二-t,隊列增長方向和x軸一致,正北方向(x=0)數(shù)值為(2t-1)2+7t,所以v=(2t-1)2+7t+x一個整數(shù),知道位數(shù),如何判斷它是否能被3整除,不可以使用除法和模運算首先3x=2\+1時僅當n為奇數(shù)才可能因為2、=3x+(-1廠n;所以該問題就轉化為了找到最后一個為1的位a,看看向前的一個1(b)和這個位的距離,如果為偶數(shù)的距離則不能整除,如果是奇數(shù),去除b之后的位繼續(xù)判斷13.seq=[a,b,...,z,aa,ab,...,az,ba,bb...,bz,...za,zb,...,zz,aaa...],求[a-z]+(從a到z任意字符組成的字符串)s在seq的位置,即排在第幾本質(zhì)就是26進制。大家都知道,看一個數(shù)是否能被2整除只需要看它的個位能否被2整除即可??墒悄阆脒^為什么嗎這是因為10能被2整除,因此一個數(shù)10a+b能被2整除當且僅當b能被2整除。大家也知道,看一個數(shù)能否被3整除只需要看各位數(shù)之和是否能被3整除。這又是為什么呢答案或多或少有些類似:因為10^-1總能被3整除。2345可以寫成2*(999+1)+3*(99+1)+4*(9+1)+5,展開就是2*999+3*99+4*9+2+3+4+5。前面帶了數(shù)字9的項肯定都能被3整除了,于是要看2345能否被3整除就只需要看2+3+4+5能否被3整除了。當然,這種技巧只能在10進制下使用,不過類似的結論可以推廣到任意進制。???注意到36是4的整數(shù)倍,而ZZZ...ZZ除以7總是得555...55。也就是說,判斷一個36進制數(shù)能否被4整除只需要看它的個位,而一個36進制數(shù)能被7整除當且僅當各位數(shù)之和能被7整除。如果一個數(shù)同時能被4和7整除,那么這個數(shù)就一定能被28整除。于是問題轉化為,有多少個連續(xù)句子滿足各位數(shù)字和是7的倍數(shù),同時最后一個數(shù)是4的倍數(shù)。這樣,我們得到了一個0(n)的算法:用P[i]表示前若干個句子除以7的余數(shù)為i有多少種情況,掃描整篇文章并不斷更新P數(shù)組。當某句話的最后一個字能被4整除時,假設以這句話結尾的前綴和除以7余x,則將此時P[x]的值累加到最后的輸出結果中(兩個前綴的數(shù)字和除以7余數(shù)相同,則較長的前綴多出來的部分一定整除7)。???上述算法是我出這道題的本意,但比賽后我見到了其它各種各樣新奇的算法。比如有人注意到36、mod28總是等于8,利用這個性質(zhì)也可以構造出類似的線性算法來。還有人用動態(tài)規(guī)劃(或者說遞推)完美地解決了這個問題。我們用表示以句子i結束,除以28余數(shù)為j的文本片段有多少個;處理下一句話時我們需要對每一個不同的j進行一次掃描,把f[iT,j]加進對應的f[i,j']中。最后輸出所有的f[i,0]的總和即可。這個動態(tài)規(guī)劃可以用滾動數(shù)組,因此它的空間同前面的算法一樣也是常數(shù)的。???如果你完全不知道我在說什么,你可以看看和進位制、同余相關的文章。另外,我之前還曾出過一道很類似的題(V0J1090),你可以對比著看一看。有一個整數(shù)n,寫一個函數(shù)f(n),返回0到n之間出現(xiàn)的〃1〃的個數(shù)。比如f(13)=6,現(xiàn)在f(1)=1,問有哪些n能滿足f(n)=n例如:f(13)=6,因為1,2,3,4,5,6,7,&9,10,11,12,13.數(shù)數(shù)1的個數(shù),正好是6.publicclassTest{publicintn二2;publicintcount二0;publicvoidBigestNumber(intnum){for(inti二1;i〈二num;i++){intm=0;intj二i;while(j>0){m=j%10;if(m==1)???count++;if(j>0)publicstaticvoidmain(Stringargs[]){Testt二newTest();longbegin=();();longend=();"總時間"+(end-begin)/1000+"秒“);結果:f()=7000001總時間5秒1、將一整數(shù)逆序后放入一數(shù)組中(要求遞歸實現(xiàn))voidconvert(int*result,intn){?if(n>=10)??convert(result+1,n/10);?*result=n%10;}intmain(intargc,char*argv[]){?intn=9,result[20]={};?convert(result,n);?printf("%d:",n);?for(inti=0;i<9;i++)??printf("%d",result);}2、求高于平均分的學生學號及成績(學號和成績?nèi)斯ぽ斎?doublefind(inttotal,intn){?intnumber,score,?average;?scanf("%d",&number);?if(number!=0){??scanf("%d",&score);??average=find(total+score,n+1);??if(score>=average)??printf("%d:%d\n",number,score);??returnaverage;?}else{??printf("Average=%d\n",total/n);??returntotal/n;?}}intmain(intargc,char*argv[]){?find(0,0);}3、 遞歸實現(xiàn)回文判斷(如:abcdedbca就是回文,判斷一個面試者對遞歸理解的簡單程序)intfind(char*str,intn){?if(n<=1)return1;?elseif(str[0]==str[nT])returnfind(str+1,n-2);?else?return0;}intmain(intargc,char*argv[]){?char*str="abcdedcba";?printf("%s:%s\n",str,find(str,strlen(str))"Yes":"No");}4、 組合問題(從M個不同字符中任取N個字符的所有組合)voidfind(char*source,char*result,intn){?if(n==l){??while(*source)???printf("%s%c\n",result,*source++);?}else{??inti,j;??for(i=0;source!=0;i++);??for(j=0;result[j]!=0;j++);??for(;i>=n;i--){??result[j]=*source++;??result[j+l]='\0';??find(source,result,nT);??}?}}intmain(intargc,char*argv[]){?intconstn二3;?char*source="ABCDE",result[n+1]={0};?if(n>0&&strlen(source)>0&&n〈二strlen(source))??find(source,result,3);}5、分解成質(zhì)因數(shù)(如435234=251*17*17*3*2,據(jù)說是華為筆試題)?if(m>n){??while(m%n!=0)n++;??m/=n;??prim(m,n);??printf("%d*",n);?}}intmain(intargc,char*argv[]){?intn=435234;?printf("%d二",n);?prim(n,2);}6、尋找迷宮的一條出路,o:通路;X:障礙。(大家經(jīng)常談到的一個小算法題)#defineMAX_SIZE?8intH[4]={0,1,0,-1};intV[4]={-1,0,1,0};?????charMaze[MAX_SIZE][MAX_SIZE]=?????????????????{'o','o','o','o','o','X','X','X'},?????????????????{'X','o','X','X','o','o','o','X'},???????????????{'X','o','X','X','o','X','X','o'},?????????????{'X','o','X','X','X','X','X','X'},pv55 , ,V,5V55 , , , , , 9v51{X,o,X,X,o,o,o,X},?????{'X','o','o','o','o','X','o','o'},?????????????????{'X','x','x','X','X','X','X','X'}};voidFindPath(intX,intY){???if(X==MAX_SIZEIIY==MAX_SIZE){????for(inti=0;i<MAX_SIZE;i++)for(intj二0;j<MAX_SIZE;j++)??????????printf(〃%c%c〃,Maze[j],j<MAX_SIZET'':'\n');}elsefor(intk=0;k<4;k++)if(X>二0&&Y>=0&&Y<MAX_SIZE&&X<MAX_SIZE&&'o'==Maze[X][Y])??? ? ? ? ? ? ? ? Maze[X][Y]='';??? ? ? ? ? ? ? ? FindPath(X+V[k],Y+H[k]);??? ? ? ? ? ? ? ? Maze[X][Y]二'o';}}intmain(intargc,char*argv[]){???FindPath(l,0);}7、隨機分配座位,共50個學生,使學號相鄰的同學座位不能相鄰(早些時候用C#寫的,沒有用C改寫)。staticvoidMain(string[]args){?intTmp=0,Count=50;??int[]Seats=newint[Count];??bool[]Students=newbool[Count];?RandStudent二new();?Students[Seats[0]=(0,Count)]二true;?for(inti二1;i<Count;){???Tmp=(int)(0,Count);???if((!Students[Tmp])&&(Seats[iT]-Tmp!=1)&&(Seats[iT]-Tmp)!=-1){??Seats[i++]=Tmp;Students[Tmp]=true;??}?}?foreach(intStudentinSeats)???+""");?、求網(wǎng)格中的黑點分布?,F(xiàn)有6*7的網(wǎng)格,在某些格子中有黑點,已知各行與各列中有黑點的點數(shù)之和,請在這張網(wǎng)格中畫出黑點的位置。(這是一網(wǎng)友提出的題目,說是他筆試時遇到算法題)#defineCOLS7intiPointsR[R0WS]={2,0,4,3,4,0};?????d:\n〃,++iCount);??? ? ? ? ? ? for(inti=0;i<ROWS;i++)??? ? ? ? ? ? ??for(intj=0;j<COLS;j++)??? ? ? ? ? ? ????printf(〃%d%c〃,Grid[j], (j+1)%COLS'''\n');????????iFound=1;//iFound=1,有解??????}???}else{?????for(intiColNo=0;iColNo<COLS;iColNo++){???????if(iPointsR[iRowNo]==0){?????????Set(iRowNo+1);??}elseif(Grid[iRowNo][iColNo]==0){Grid[iRowNo][iColNo]=1;iSumR[iRowNo]++;iSumC[iColNo]++;?????????????????if(iSumR[iRowNo]<="iPointsC[iColNo])〃〈二〃〃div二〃〃style二〃word-wrap:break-word;〃>???????????Set(iRowNo);elseif(iSumR[iRowNo]==iPointsR[iRowNo]&&iRowNo<ROWS)??? ? ? ? ? ? ???Set(iRowNo+1);??? ? ? ? ? ? ?Grid[iRowNo][iColNo]= 0;??? ? ? ? ? ? ?iSumR[iRowNo]—;iSumC[iColNo]—;???????}?????}???}returniFound;??//用于判斷是否有解}intmain(intargc,char*argv[]){???if(!Set(0))?????printf("Failure!");}9、有4種面值的郵票很多枚,這4種郵票面值分別1,4,12,21,現(xiàn)從多張中最多任取5張進行組合,求取出這些郵票的最大連續(xù)組合值。(據(jù)說是華為2003年校園招聘筆試題)#defineN5#defineM5intk,Found,Flag[N];intStamp[M]={0,1,4,12,21};//在剩余張數(shù)n中組合出面值和ValueintCombine(intn,intValue){?if(n>=0&&Value==0){??Found=1;??intSum=0;??for(inti=0;i〈二"div二""style二"word-wrap:break-word;"〉??Sum+=Stamp[Flag];??printf("%d",Stamp[Flag]);??}??printf("\tSum=%d\n\n",Sum);?}elsefor(inti=l;iO;i++)??if(Value-Stamp>=0){??Flag[k++]=i;??Combine(nT,Value-Stamp);??Flag[—k]=0;??}?returnFound;}intmain(intargc,char*argv[]){?for(inti=l;Combine(N,i);i++,Found=0);}10、大整數(shù)數(shù)相乘的問題。(這是2002年在一考研班上遇到的算法題)voidMultiple(charA[],charB[],charC[]){???intTMP,In=0,LenA=T,LenB=T;???while(A[++LenA]!='\0');???while(B[++LenB]!='\0');???intIndex,Start二LenA+LenB一1;???for(inti二LenBT;i>=0;i一){?????Index=Start--;?????if(B!='0'){??? ? ? ? ?for(intIn=0,j二LenAT;j>=0;j—) {??? ? ? ? ?? ?TMP=(C[Index]—'0‘)+(A[j]-'0')*(B—'0')+In;??? ? ? ? ?? ?C[Index—]=TMP%10+'0';??? ? ? ? ?? ?In=TMP/10;??? ? ? ? ?}???????C[Index]=In+'0';?????}???}}intmain(intargc,char*argv[]){???charA[]="";???charB[]="99988〃;charC[sizeof(A)+sizeof(B)-1];???for(intk=0;k<二〃〃div二〃〃style二〃word-wrap:break-word;"〉?????C[k]='0';???C[sizeof(C)T]='\0';???Multiple(A,B,C);???for(inti=0;C!='\0';i++)11、求最大連續(xù)遞增數(shù)字串(如“ads3sl456789DF3456ld345AA”中的“456789”)intGetSubString(char*strSource,char*strResult){???intiTmp=0,iHead=0,iMax=0;???for(intIndex=0,iLen=0;strSource[Index];Index++){?????if(strSource[Index]>='O'&&strSource[Index]<='9'&&strSource[IndexT]>'O'&&strSource[Index]==strSource[IndexT]+1){???????iLen++;???????????//連續(xù)數(shù)字的長度增1?????}else{?????????????//出現(xiàn)字符或不連續(xù)數(shù)字???????if(iLen>iMax){???????iMax=iLen;?iHead=iTmp;???????}?????????//該字符是數(shù)字,但數(shù)字不連續(xù)???????if(strSource[Index]>='O'&&strSource[Index]<='9'){?????????iTmp=Index;iLen=1;?????} ???? ? ? ?J ?????}???for(iTmp=0;iTmp<iMax;iTmp++)//將原字符串中最長的連續(xù)數(shù)字串賦值給結果串?????strResult[iTmp]=strSource[iHead++];???strResult[iTmp]二'\0';???returniMax;??//返回連續(xù)數(shù)字的最大長度}intmain(intargc,char*argv[]){???charstrSource□二"ads3sl456789DF3456ld345AA",charstrResult[sizeof(strSource)];printf("Len=%d,strResult=%s\nstrSource=%s\n",GetSubString(strSource,strResult),strResult,strSource);}12、四個工人,四個任務,每個人做不同的任務需要的時間不同,求任務分配的最優(yōu)方案。(2005年5月29日全國計算機軟件資格水平考試一一軟件設計師的算法題)。#include""#defineN4intCost[N][N]二{{2,12,5,32},?//行號:任務序號,列號:工人序號???????????{24,1&9,6},???????????{21,1,8,28}};intMinCost=1000;intTask[N],TempTask[N],Worker[N];voidAssign(intk,intcost){?if(k==N){??MinCost二cost;??for(inti=0;i〈二"div二""style二"word-wrap:break-word;"〉??TempTask=Task;?}else{??for(inti=0;i〈二"div二""style二"word-wrap:break-word;"〉??if(Worker==0&&cost+Cost[k]<MinCost){//為提高效率而進行剪枝???Worker=1;Task[k]=i;???Assign(k+1,cost+Cost[k]);???Worker=0;Task[k]=0;??}??}?}}intmain(intargc,char*argv[]){?Assign(0,0);?printf("最佳方案總費用=%d\n",MinCost);?for(inti=0;i〈二"“div二""style二"word-wrap:break-word;"〉??printf("\t任務%d由工人%d來做:%d\n",i,TempTask,Cost[TempTask]);}13、八皇后問題,輸出了所有情況,不過有些結果只是旋轉了90度而已。(回溯算法的典型例題,是數(shù)據(jù)結構書上算法的具體實現(xiàn),大家都親自動手寫過這個程序嗎)#defineN8intBoard[N][N];intValid(inti,intj){?//判斷下棋位置是否有效?intk=1;?for(k=1;i>=k&&j>=k;k++)??if(Board[i—k][j—k])return0;?for(k=1;i>=k;k++)??if(Board[i-k][j])?return0;?for(k=1;i>=k&&j+k<=""div二""style二"word-wrap:break-word;"〉??if(Board[i—k][j+k])return0;?return1;voidTrial(inti,intn){?//尋找合適下棋位置?if(i==n){??for(intk=0;k<=""div二""style二"word-wrap:break-word;"〉??for(intm=0;m<=""div二""style二"word-wrap:break-word;"〉???printf("%d",Board[k][m]);??printf("\n");??}??printf("\n");?}else{??for(intj=0;j<=""div二""style二"word-wrap:break-word;">??Board[j]=1;??if(Valid(i,j))???Trial(i+l,n);??Board[j]=0;??}?}}intmain(intargc,char*argv[]){?Trial(0,N);14、實現(xiàn)strstr功能,即在父串中尋找子串首次出現(xiàn)的位置。(筆試中常讓面試者實現(xiàn)標準庫中的一些函數(shù))char*strstring(char*ParentString,char*SubString){?char*pSubString,*pPareString;?for(char*pTmp二ParentString;*pTmp;pTmp++){??pSubString=SubString;??pPareString=pTmp;??while(*pSubString==*pPareString&&*pSubString!='\0'){??pSubString++;??pPareString++;??}??if(*pSubString=='\0')?returnpTmp;?}?returnNULL;}intmain(intargc,char*argv[]){?char*ParentString=""happybirthdaytoyou!"";?char*SubString=""birthday"";?printf(""%s"",strstring(ParentString,SubString));}15、現(xiàn)在小明一家過一座橋,過橋的時候是黑夜,所以必須有燈?,F(xiàn)在小明過橋要1分,小明的弟弟要3分,小明的爸爸要6分,小明的媽媽要8分,小明的爺爺要12分。每次此橋最多可過兩人,而過橋的速度依過橋最慢者而定,而且燈在點燃后30分就會熄滅。問小明一家如何過橋時間最短(原本是個小小智力題,據(jù)說是外企的面試題,在這里用程序來求解)#include""#defineN??5#defineSIZE64//將人員編號:小明-0,弟弟-1,爸爸-2,媽媽-3,爺爺-4//每個人的當前位置:0—在橋左邊,1—在橋右邊intPosition[N];??//過橋臨時方案的數(shù)組下標;臨時方案;最小時間方案;intIndex,TmpScheme[SIZE],Scheme[SIZE];?//最小過橋時間總和,初始值100;每個人過橋所需要的時間intMinTime=100,Time[N]={1,3,6,&12};?//尋找最佳過橋方案。Remnant:未過橋人數(shù);CurTime:當前已用時間;//Direction:過橋方向,1一向右,0—向左voidFind(intRemnant,intCurTime,intDirection){???if(Remnant二二0){???????????????//所有人已經(jīng)過橋,更新最少時間及方案?????MinTime二CurTime;?????for(inti=0;i=0;i++)???????Scheme=TmpScheme;???}elseif(Direction二二1){????????????//過橋方向向右,從橋左側選出兩人過橋?????for(inti=0;i〈二"div二""style二"word-wrap:break-word;"〉??? ? ? ? ?if(Position二二0&&CurTime + Time < MinTime) {??? ? ? ? ? ? ?TmpScheme[Index++] =i;??? ? ? ? ? ? ?Position二1;??? ? ? ? ? ? ?for(intj=0;j<="" div二""style二"word-wrap:break-word;">???????????intTmpMax=(Time>Time[j]Time:Time[j]);???????????if(Position[j]==0&&CurTime+TmpMax<MinTime){TOC\o"1-5"\h\z??? ? ? ? ? ? ? ? ? ? ?TmpScheme[Index++] = j;????? ? ? ? ? ? ? ? ? ? ?Position[j]二1;? ? ???????????????Find(Remnant-2,CurTime+TmpMax,!Direction);??? ? ? ? ? ? ? ? ? ? ?Position[j]二0;? ? ????? ? ? ? ? ? ? ? ? ? ?TmpScheme[—Index] = -1;??? ? ? ? ? ? ? ? ?}??? ? ? ? ? ? ?}?????????Position二0;?????????TmpScheme[一Index]=T;???????}???}else{????//過橋方向向左,從橋右側選出一個人回來送燈?????for(intj=0;j<=""div二""style二"word-wrap:break-word;"〉???????if(Position[j]==1&&CurTime+Time[j]<MinTime){TOC\o"1-5"\h\z??? ? ? ? ? ? ?TmpScheme[Index++] = j;??? ? ? ? ? ? ?Position[j]二0;??? ? ? ? ? ? ?Find(Remnant+1,CurTime+Time[j],!Direction);??? ? ? ? ? ? ?Position[j]二1;??? ? ? ? ? ? ?TmpScheme[一Index] = T;??? ? ? ? ?}??? ? ?}???}}intmain(intargc,char*argv[]){???for(inti=0;i〈二"div二""style二"word-wrap:break-word;"〉?????Scheme=TmpScheme=T;Find(N,0,1);????//查找最佳方案???printf("MinTime=%d:",MinTime);//輸出最佳方案???for(inti=0;i=0;i+=3)?????printf(“?%d-%d?%d",Scheme,Scheme[i+1],Scheme[i+2]);???printf("\b\b?");}16、2005年11月金山筆試題。編碼完成下面的處理函數(shù)。函數(shù)將字符串中的字符'*'移到串的前部分,前面的非'*'字符后移,但不能改變非'*'字符的先后順序,函數(shù)返回串中字符'*'的數(shù)量。如原始串為:ab**cd**e*12,處理后為*****abcdel2,函數(shù)并返回值為5。(要求使用盡量少的時間和輔助空間)intchange(char*str){???intcount=0;???for(inti=0,j=0;str;i++){???if(str二二'*'){????for(j=i-1;str[j]!='*'&&j>=0;j—)???str[j+1]=str[j];????str[j+1]='*';??count++;??}?}?returncount;}intmain(intargc,char*argv[]){?charstr[]=〃ab**cd**e*12〃;?printf(""str1=%s\n〃,str);?printf(""str2=%s,count二%d〃,str,change(str));}//終于得到一個比較高效的算法,一個網(wǎng)友提供,估計應該和金山面試官的想法一致。算法如下:intchange(char*str){?inti,j二strlen(str)T;?for(i=j;j>=0;j—){??if(str!='*'){??i—;??}elseif(str[j]!二'*'){??str=str[j];??str[j]='*';??i--;??}?}?returni+1;}17、2005年11月15日華為軟件研發(fā)筆試題。實現(xiàn)一單鏈表的逆轉。#include""typedefchareleType;?//定義鏈表中的數(shù)據(jù)類型typedefstructlistnode?{//定義單鏈表結構?eleTypedata;?structlistnode*next;}node;node*create(intn){?//創(chuàng)建單鏈表,n為節(jié)點個數(shù)?node*p=(node*)malloc(sizeof(node));?node*head=p;?head->data='A';?for(inti='B';i〈'A'+n;i++){????p=(p->next二(node*)malloc(sizeof(node)));??p->data=i;??p->next二NULL;??}?returnhead;}voidprint(node*head){//按鏈表順序輸出鏈表中元素?for(;head;head=head->next)??printf(〃%c",head->data);?printf(〃\n〃);}node*reverse(node*head,node*pre){//逆轉單鏈表函數(shù)。這是筆試時需要寫的最主要函數(shù)?node*p=head->next;?head->next二pre;?if(p)returnreverse(p,head);?else?returnhead;}intmain(intargc,char*argv[]){?print(head);?head=reverse(head,NULL);?print(head);}18、編碼實現(xiàn)字符串轉整型的函數(shù)(實現(xiàn)函數(shù)atoi的功能),據(jù)說是神州數(shù)碼筆試題。如將字符串”+123”123,”-0123”-123,“123CS45”123,“”123, “”0#include""intstr2int(constchar*str){??//字符串轉整型函數(shù)?inti=0,sign=1,value=0;?if(str二二NULL)?returnNULL;??//空串直接返回NULL?if(str[0]=='-'||str[0]=='+'){?//判斷是否存在符號位??i=1;??sign=(str[0]=='-' -1:1);?}?for(;str>='0'&&str<='9';i++)//如果是數(shù)字,則繼續(xù)轉換??value=value*10+(str-'0');?returnsign*value;}intmain(intargc,char*argv[]){?char*str="";?printf("str二%s\tval=%d\n",str,val);}19、 歌德巴赫猜想。任何一個偶數(shù)都可以分解為兩個素數(shù)之和。(其實這是個C二級考試的模擬試題)#include""#include""intmain(intargc,char*argv[]){?intEven=78,Primel,Prime2,Tmp1,Tmp2;?for(Prime1=3;Primel〈二Even/2;Prime1+=2){??for(Tmp1=2,Tmp2二sqrt(float(Prime1));Tmp1<=Tmp2&&Prime1%Tmp1!=0;Tmp1++);??if(Tmp1<=Tmp2)continue;??Prime2=Even-Prime1;??for(Tmp1=2,Tmp2二sqrt(float(Prime2));Tmp1<=Tmp2&&Prime2%Tmp1!=0;Tmp1++);??if(Tmp1<=Tmp2)continue;??printf("%d=%d+%d\n".Even,Prime1,Prime2);?}}20、 快速排序(東軟喜歡考類似的算法填空題,又如堆排序的算法等)#include""#defineN10intpart(intlist[],intlow,inthigh){?//一趟排序,返回分割點位置?inttmp=list[low];?while(low<=""div二""style二"word-wrap:break-word;"〉??while(low二tmp)--high;??list[low]=list[high];??while(low<二"tmp)"?++low;二""<=""div二""style二"word-wrap:break-word;">??list[high]=list[low];?}?list[low]=tmp;?returnlow;}voidQSort(intlist[],intlow,inthigh){//應用遞歸進行快速排序?if(low<=""div二""style二"word-wrap:break-word;"〉??intmid=part(list,low,high);??QSort(list,low,mid-1);??QSort(list,mid+1,high);?}}voidshow(intlist[],intn){??//輸出列表中元素?for(inti=0;i〈二"“div二""style二"word-wrap:break-word;"〉??printf("%d",list);?printf("\n");}intmain(intargc,char*argv[]){?intlist[N]二{23,65,26,1,6,89,3,12,33,8};?show(list,N);???//輸出排序前序列?QSort(list,0,N-1);??//快速排序?show(list,N);???//輸出排序后序列}21、005年11月23日慧通筆試題:寫一函數(shù)判斷某個整數(shù)是否為回文數(shù),如12321為回文數(shù)。可以用判斷入棧和出棧是否相同來實現(xiàn)(略微復雜些),這里是將整數(shù)逆序后形成另一整數(shù),判斷兩個整數(shù)是否相等來實現(xiàn)的。#include""intIsEchoNum(intnum){?inttmp=0;?for(intn二num;n;n/=10)??tmp=tmp*10+n%10;?returntmp二二num;}intmain(intargc,char*argv[]){?intnum=12321;?printf("%d?%d\n",num,IsEchoNum(num));}22、刪除字符串中的數(shù)字并壓縮字符串(神州數(shù)碼以前筆試題),如字符串”abcl23de4fg56”處理后變?yōu)?abcdefg”。注意空間和效率。(下面的算法只需要一次遍歷,不需要開辟新空間,時間復雜度為0(N))#include""voiddelNum(char*str){?inti,j=0;//找到串中第一個數(shù)字的位子?for(i=j=0;str&&(str<'0' ||str>'9');j=++i);??//從串中第一個數(shù)字的位置開始,逐個放入后面的非數(shù)字字符?for(;str;i++)???if(str〈'O'||str>'9')??str[j++]=str;?str[j]='\0';}intmain(intargc,char*argv[]){?charstr[]="abc123ef4g4h5";?printf("%s\n",str);?printf("%s\n",str);23、求兩個串中的第一個最長子串(神州數(shù)碼以前試題)。女口""abr

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論