應聘華為軟件的上機試題及部分答案.doc_第1頁
應聘華為軟件的上機試題及部分答案.doc_第2頁
應聘華為軟件的上機試題及部分答案.doc_第3頁
應聘華為軟件的上機試題及部分答案.doc_第4頁
應聘華為軟件的上機試題及部分答案.doc_第5頁
已閱讀5頁,還剩20頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1,判斷電話號碼是否合法:/要注意情況包含,有可能會同時出現幾種不好的情況,要按照順序輸出錯誤。不能同時輸出好幾種錯誤,應該是這樣包含:先判斷長度是否符合,再判斷是否以86打頭,再判斷有無其他字符int fun(char num)char *p=num;int n=strlen(num);if(n=13)if(*p=8&*(p+1)=6)while(*p!=0)if(*p=0&*p=9)p+;else return 2;if(*p=0)return 0;else return 3;elsereturn 1;int main()char num=87139a3887671;int k=fun(num);coutk=0&j=0;i-,j-)if(arry1i!=arry2j)k+;return k;int main()int num1=1,3,5;int num2=77,21,1,3,5;int k=f(3,num1,5,num2);coutkendl;return 0;3.約瑟夫問題 問題描述:輸入一個由隨機數組成的數列(數列中每個數均是大于0的整數,長度已知),和初始計數值m。從數列首位置開始計數,計數到m后,將數列該位置數值替換計數值m,并將數列該位置數值出列,然后從下一位置從新開始計數,直到數列所有數值出列為止。如果計數到達數列尾段,則返回數列首位置繼續(xù)計數。請編程實現上述計數過程,同時輸出數值出列的順比如: 輸入的隨機數列為:3,1,2,4,初始計數值m=7,從數列首位置開始計數(數值3所在位置)第一輪計數出列數字為2,計數值更新m=2,出列后數列為3,1,4,從數值4所在位置從新開始計數第二輪計數出列數字為3,計數值更新m=3,出列后數列為1,4,從數值1所在位置開始計數第三輪計數出列數字為1,計數值更新m=1,出列后數列為4,從數值4所在位置開始計數最后一輪計數出列數字為4,計數過程完成。輸出數值出列順序為:2,3,1,4。 要求實現函數:voidarray_iterate(intlen,intinput_array,intm,intoutput_array)【輸入】 intlen:輸入數列的長度;intintput_array:輸入的初始數列intm:初始計數值【輸出】 intoutput_array:輸出的數值出列順序 示例輸入:intinput_array=3,1,2,4,intlen=4,m=7輸出:output_array=2,3,1,4函數如下:void fun(int len,int a1,int len2,int a2)int n=0,i=-1,k=1,m=len2;while(1)for(int j=0;jm;)i=(i+1)%len; /注意這個是%,不要寫成/if(a1i!=0)j+; m=a1i;a2n+=a1i;a1i=0; if(k=len)break; k+;4.簡單四則運算 問題描述:輸入一個只包含個位數字的簡單四則運算表達式字符串,計算該表達式的值注: 1、表達式只含+,-,*,/四則運算符,不含括號2、表達式數值只包含個位整數(0-9),且不會出現0作為除數的情況3、要考慮加減乘除按通常四則運算規(guī)定的計算優(yōu)先級4、除法用整數除法,即僅保留除法運算結果的整數部分。比如8/3=2。輸入表達式保證無0作為除數情況發(fā)生5、輸入字符串一定是符合題意合法的表達式,其中只包括數字字符和四則運算符字符,除此之外不含其它任何字符,不會出現計算溢出情況 要求實現函數:intcalculate(intlen,char*expStr)【輸入】 intlen:字符串長度;char*expStr:表達式字符串;【輸出】 無【返回】 計算結果 示例1) 輸入:char*expStr=“1+4*5-8/3” 函數返回:192) 輸入:char*expStr=“8/3*3” 函數返回:6 簡化版的四則運算:沒有括號,只有加減乘除四種運算int fun(char a,int len) /字符數組和字符數組的長度int num20;char str20;int k1=0,k2=0;int data=0;for(int i=0;i=0&ai=9) numk1+=ai-0;if(ai=-|ai=+)strk2+=ai;if(ai=*) numk1-1=numk1-1*(ai+1-0);i+;/遇見*,就運算,結果保存在數組中if(ai=/) numk1-1=numk1-1/(ai+1-0);i+;int temp=num0;int j=0; /兩個數組只剩下數組和加減運算符while(jk2) /順序運算if(strj=-)temp=temp-numj+1;else if(strj=+)temp=temp+numj+1;j+;return temp;int main() har a=3*3+7+4/3;int k=fun(a,9);coutkendl;return 0;函數實現2:中序表達式轉換為后序表達式,使用算法實現int isp(char c) int p;switch(c)case *:case /:p=1;break;case +:case -: p=0;break;return p;char* transf(int len,char a,char b)int k=0;stack s1;for(int i=0;i=0&ai=9)bk+=ai; else if(s1.empty()s1.push(ai); else while(isp(ai)=isp(s1.top() bk+=s1.top();s1.pop();s1.push(ai);while(s1.empty()bk+=s1.top();s1.pop();bk=0;return b;void fun(char c,stack s2) char p1,p2;if(!s2.empty()p1=s2.top();s2.pop();else pos=false;coutkongzhanendl;if(!s2.empty()p2=s2.top();s2.top();else pos=false;coutkongzhanendl;if(pos=true)switch(c)case +:s2.push(p1+p2);break;case -:s2.push(p2-p1);break;case *:s2.push(p1*p2);break;case /:s2.push(p2/p1);break;void eval(char a) stack s2;for(int i=len;ilen;i+)switch(ai)case +:case -:case *:case /:fun(ai,&s2);break;default:s2.push(ai-0);break;int main() char a=1+4*5-8/3;int len=strlen(a);char b20;char *q=transf(9,a,b);coutqendl;return 0;5、一副牌中發(fā)五張撲克牌給你:讓你判斷數字的組成:有以下幾種情況:1:四條:即四張一樣數值的牌(牌均不論花色) 2:三條帶一對3:三條帶兩張不相同數值的牌 4:兩對 5:順子包括10,J,Q,K,A6:什么都不是 7:只有一對 思路:將數組排序,統計相同的數字的個數,再分情況討論void sort(int a)int temp;for(int i=0;i5;i+) for(int j=0;jaj)temp=ai;ai=aj;aj=temp;void test(int a)int *b=new int5;int k=1;for(int i=0;i5;i+) bi=ai;for(int j=0;j4;j+)if(aj=aj+1)k+;if(k=4)if(b1=b3)cout四條endl;elsecout三條帶一對endl;if(k=3)if(b1!=b2|b2!=b3)cout三條帶兩個不同的牌endl;elsecout兩對endl;if(k=2)cout一對endl;if(k=1)if(b4-b0=4&b4-b1=3&b4-b2=2&b4-b3=1)cout順子endl;elsecout什么都不是endl; int main() int a=1,2,4,4,4;test(a);return 0;6、求兩個數組的和差就是去掉兩個數組中相同的元素然后將兩個數組中的元素存放在一個新的數組中,按大小順序排序思路:將數組A和數組B分別進行排序,然后將A與B進行比較,重復的跳過去,不重復的賦給數組C,依次輸出。 while(i la & j lb) if(aai bbj) csub = bbj; +sub; +j; else if(aai = bbj) +i; +j; for(; i la; +i) csub = aai; +sub; for(; j next;while(p2)p3=p2-next;p2-next=p1;p1=p2;p2=p3;head-next=NULL;head=p1;return head;8、 將一個字符串的元音字母復制到另一個字符串,并排序(30分)問題描述:有一字符串,里面可能包含英文字母(大寫、小寫)、數字、特殊字符,現在需要實現一函數,將此字符串中的元音字母挑選出來,存入另一個字符串中,并對字符串中的字母進行從小到大的排序(小寫的元音字母在前,大寫的元音字母在后,依次有序)。說明:1、 元音字母是a,e,i,o,u,A,E,I,O,U。 2、 篩選出來的元音字母,不需要剔重;最終輸出的字符串,小寫元音字母排在前面,大寫元音字母排在后面,依次有序。要求實現函數:void sortVowel (char* input, char* output);using namespace std;void fun(char a,char s) /提取元音字母,放入數組int i=0,n=0;while(ai!=0)if(ai=a|ai=e|ai=i|ai=o|ai=u)sn+=ai;else if(ai=A|ai=E|ai=I|ai=O|ai=U)sn+=ai;i+;char temp; /將數組排序for(int i=0;in-1;i+)for(int j=0;jsj+1)temp=sj;sj=sj+1;sj+1=temp;int k=0; /定位大寫字母的最后位置while(sk=A&sk=Z)k+; for(int j=0;jn;j+) /輸出原字符串 coutsj ; coutendl;char *p=new char20; /將字符串變換位置,輸出。char *q=p; for(int i=k;in;i+)*p=si;p+;for(int j=0;jk;j+)*p=sj;p+;*p=0;coutqendl;int main() char str=HaJsdStOoAOeINaPQaWEiAIiO;char s20;fun(str,s);return 0;9、身份證號碼合法性判斷我國公民的身份證號碼特點如下:1、 長度為18位;2、 第117位只能為數字;3、 第18位可以是數字或者小寫英文字母x。4、 身份證號碼的第714位表示持有人生日的年、月、日信息。例如:511002 19880808 0111或511002 19880808011x。請實現身份證號碼合法性判斷的函數。除滿足以上要求外,需要對持有人生日的年、月、日信息進行校驗。年份大于等于1900年,小于等于2100年。需要考慮閏年、大小月的情況。所謂閏年,能被4整除且不能被100整除 或 能被400整除的年份,閏年的2月份為29天,非閏年的2月份為28天。其他情況的合法性校驗,考生不用考慮。函數返回值:1) 如果身份證號合法,返回0;2) 如果身份證號長度不合法,返回1;3) 如果身份證號第117位含有非數字的字符,返回2;4) 如果身份證號第18位既不是數字也不是英文小寫字母x,返回3;5) 如果身份證號的年信息非法,返回4;6) 如果身份證號的月信息非法,返回5;7) 如果身份證號的日信息非法,返回6(請注意閏年的情況);要求實現函數:int verifyIDCard(char* input)示例1) 輸入:”511002 111222”,函數返回值:1;2) 輸入:”511002 abc123456789”,函數返回值:2;3) 輸入:”511002 19880808123a”,函數返回值:3;4) 輸入:”511002 188808081234”,函數返回值:4;5) 輸入:”511002 198813081234”,函數返回值:5;6) 輸入:”511002 198808321234”,函數返回值:6;7) 輸入:”511002 1989 0229 1234”,函數返回值:7;8) 輸入:”511002 198808081234”,函數返回值:0;int fun(char *str)int year=0,month=0,day=0;if(strlen(str)-1)18) /1 for(int i=0;i=0&stri=0&str17=9)/3for(int i=6;i1900&year2100)/4 for(int i=10;i0&month=12)/5 for(int i=12;i14;i+) day=day*10+stri-0; if(day=31)/6 if(year%4!=0&month=2&day=28)return 0;else if(year%4=0&month=2&day29) return 0;else if(year%4!=4&month!=2&day31)return 0;else return 6; else return 6; elsereturn 5;else return 4; else return 3; else return 1;int main()char a=340621198608377817;int k=fun(a);coutkendl;return 0;10、比較一個數組的元素 是否為回文數組判斷是否是回文數組:bool fun(char a)int n=strlen(a);int i=0,j=n-1;while(ij)if(ai!=aj)return false;i+;j-;return true;11、求兩個數組的和差:就是去掉兩個數組中相同的元素 然后將兩個數組中的元素存放在一個新的數組中 且數組A中元素要在B數組元素之前思路:利用循環(huán)比較,將相同的數字的標記為0,再賦給數組Cint main() int a=1,3,5,7,9,12,13;int s=1,3,5,6,7,8,9;int len1=sizeof(a)/sizeof(int);int len2=sizeof(s)/sizeof(int);for(int i=0;ilen1;i+)for(int j=0;jlen2;j+)if(ai=sj)ai=0;sj=0;int t30;int k=0,i=0,j=0;while(ilen1)if(ai!=0)tk+=ai;i+;while(jlen2)if(sj!=0)tk+=sj;j+;for(int i=0;ik;i+)coutti ;return 0;12、字符串計算1、選秀節(jié)目打分,分為專家評委和大眾評委,score數組里面存儲每個評委打的分數,judge_type里存儲與score數組對應的評委類別,judge_type=1,表示專家評委,judge_type=2,表示大眾評委,n表示評委總數。打分規(guī)則如下:專家評委和大眾評委的分數先分別取一個平均分(平均分取整),然后,總分=專家評委平均分*0.6+大眾評委*0.4,總分取整。如果沒有大眾評委,則總分=專家評委平均分,總分取整。函數最終返回選手得分。int cal_score(int score, int judge_type, int n)int sum1=0,sum2=0,avg1=0,avg2=0;int m=0,k=0;for(int i=0;in;i+)if(judge_typei=1)sum1=sum1+scorei;m+;if(judge_typei=2)sum2=sum2+scorei;k+;avg1=sum1/m;avg2=sum2/k;return (int)(avg1*0.6+avg2*0.4);int main() int input=3,6,1,9,7,8;int output=1,1,2,1,2,2;int n=sizeof(input)/sizeof(int);int p=cal_score(input,output,n);coutpendl;return 0;13、給定一個數組input,如果數組長度n為奇數,則將數組中最大的元素放到output數組最中間的位置,如果數組長度n為偶數,則將數組中最大的元素放到output數組中間兩個位置偏右的那個位置上,然后再按從大到小的順序,依次在第一個位置的兩邊,按照一左一右的順序,依次存放剩下的數。例如:input=3,6,1,9,7output=3,7,9,6,1;input=3,6,1,9,7,8output=1,6,8,9,7,3函數接口voidsort(intinput,intn,intoutput)using namespace std;void sort(int input,int n,int output)int i=0,j=n-1;int temp;for(int i=0;in-1;i+)for(int j=0;jinputj+1)temp=inputj;inputj=inputj+1;inputj+1=temp;int k=0;i=0;j=n-1;while(ij)outputi+=inputk+;outputj-=inputk+;coutoutput3endl;int main() int input=3,6,1,9,7,8;int output20;sort(input,6,output);return 0;14、操作系統任務調度問題。操作系統任務分為系統任務和用戶任務兩種。其中,系統任務的優(yōu)先級=50且=255。優(yōu)先級大于255的為非法任務,應予以剔除?,F有一任務隊列task,長度為n,task中的元素值表示任務的優(yōu)先級,數值越小,優(yōu)先級越高。函數scheduler實現如下功能,將task中的任務按照系統任務、用戶任務依次存放到system_task數組和user_task數組中(數組中元素的值是任務在task數組中的下標),并且優(yōu)先級高的任務排在前面,數組元素為-1表示結束。task=0,30,155,1,80,300,170,40,99system_task=0,3,1,7,-1user_task=4,8,2,6,-1函數接口:void scheduler(int task, int n,int system_task, int user_task) int *p = new intn; int i,j,temp; int k1=0,k2=0; for(i = 0;in;i+) pi = i;for(i = 0;in-1 ;i+) for(j=0;j*(task+pj+1) temp = pj;pj = pj+1;pj+1 = temp; /此處是排下標 for(j=0;jn;j+) if(*(task+pj)=50 & *(task+pj)k) /創(chuàng)建單鏈表s=new node1;s-data=k;p-next=s;p=s;head=head-next; /開始的的時候head是表頭節(jié)點,現在是第一個節(jié)點p-next=NULL;return head;node *creat()node *head,*p,*s;head=new node1;p=head;int k,cyc=1;while(cyc)coutk;if(k!=0)s=new node1;s-data=k;p-next=s;p=s;elsecoutOK!next;p-next=NULL;return head;node *reverse(node *head)node *p1,*p2,*p3;p1=head;p2=head-next;while(p2)p3=p2-next;p2-next=p1;p1=p2;p2=p3;head-next=NULL;head=p1;return head;node *del(node *head,int num)node *p,*s;p=head;while(p-data!=num&p-next!=NULL)s=p;p=p-next;if(p-data=num)if(p=head)head=p-next;delete p;elses-next=p-next;delete p;elsecout未找到要刪除的節(jié)點data=num;while(p-datanext!=NULL)s=p;p=p-next;if(numdata)if(p=head)t-next=p;head=s;else t-next=p;s-next=t;else /把插入點定位在了鏈尾p-next=t;t-next=NULL;return head; node *sort(node* head) node *p; int temp; int n=sizeof(head)/sizeof(node); if(head=NULL&head-next=NULL)return head; p=head; for(int i=0;in;i+) p=head;for(int j=0;jdatap-next-data) temp=p-data;p-data=p-next-data;p-next-data=temp; return head; node *sort(node *head)node *p;int temp;int n;n=length(head);if(head=NULL&head-next=NULL)return head;for(int i=0;in;i+) p=head;for(int j=0;jnext!=NULL)if(p-datap-next-data)temp=p-data;p-data=p-next-data;p-next-data=temp;p=p-next;coutnew sort is:endl;return head;int main()node *p1; p1=creat();sort(p1);print(p1);coutdata=num;p-next=top;top=p;void pop(node &top)node *p=top;int n=top-data;top=top-next;coutni;j-) if(sjsj-1) b=1; temp=sj; sj=sj-1; sj-1=temp; for(j=i;jsj+1) b=1;temp=sj;sj=sj+1;sj+1=temp; i+;18、掃描數組,求出最大的增量長度:int main() int a=7,2,3,4,5,6,8;int n=7;int max=1,len=1;for(int i=1;i=ai-1) len+; continue; /跳出本次循環(huán),繼續(xù)以下的部分if(maxlen)max=len;len=1;coutmaxendl;return 0;19、掃描整數序列,求出最大長度子序列:思路:定義兩個游標i j分別在數組的左右,從兩邊收縮,計算i j之間數組的總和,然后比較,求出最大的記錄,并將此時的i j 記錄下來。int main() int s=1,20,-3,49,59,10,30,20,-41,90,-2,-30,60.-29;int n=sizeof(s)/sizeof(int);int i,k,j,a,b,num,max=0;for( i=0;i=i;j-) num=0;for( k=i;k=j;k+)num=num+sk; if(maxnum) max=num; a=i; b=j; for(int m=a;m=b;m+)coutsm ;return 0; 20、直接插入排序:void insertsort(int a,int n)int x,j;for(int i=1;i=0&xaj;j-)aj+1=aj; aj+1=x;21、提取字符串中的數字:在字符串ab00cd+123fght456-253.005fgh中提取的字符是0,123,456,253,5。void fun( char str, int outArray)char *p=str;int count=0,value=0;while(*p!=0)if(*p=0&*p=0&*p0)stri=num%10+0;num=num/10;i+;i-;while(i=0)tempj+=stri-;tempj=0;couttempN; /定義輸入的行數 getchar(); /輸入的N行字符 for(int i=0;iN;i+) while(1) /記住控制方法 ch=getchar(); /這是單個字符 if(ch=a)num+; if(ch=n)break; coutnum=0&j=0) resultn+=(pi-0)+(qj-0)+k)%10+0; k=(pi-0)+(qj-0)/10; i-;j-; while(i=0) resultn+=(pi-0)+k)%10+0; k=(pi-0)+k)/10; i-; while(j0) resultn+=(qj-0)+k)%10+0; k=(qj-0)+k)/10; i-; if(k=1) resultn+=1; /如果是兩個負數相加 ,加上resultn+=-

溫馨提示

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

評論

0/150

提交評論