程序员面试题编程题.docx
- 文档编号:11778603
- 上传时间:2023-06-02
- 格式:DOCX
- 页数:70
- 大小:2.22MB
程序员面试题编程题.docx
《程序员面试题编程题.docx》由会员分享,可在线阅读,更多相关《程序员面试题编程题.docx(70页珍藏版)》请在冰点文库上搜索。
程序员面试题编程题
1.利用递归调用手段编程计算N!
答:
#include
usingnamespacestd;
intt;
intn;
intFind(intn)
{
if(n==1)
{
return1;
}
else
{
t=Find(n-1)*n;
returnt;
}
}
intmain(void)
{
cin>>n;
intt=Find(n);
cout< ="< return0; } 2.写一个八进制转换为十进制的问题的程序。 (设八进制数只有两位数的) #include usingnamespacestd; unsignedintoct2dec(unsignedintoct) { returnoct/10*8+oct%10; } intmain(void) { unsignedintoct=0; unsignedintdec=0; cout<<”pleaseinputaoctetnumber(Besurethenumberyouinputisbeginwitha‘0’): ”<<’\n’; cin>>oct; dec=oct2dec(oct); cout< return0; } 3.写出二分查找的代码. intbinary_search(int*arr,intkey,intn) { intlow=0; inthigh=n-1; intmid; while(low<=high) { mid=(high+low)/2; if(arr[mid]>key) high=mid-1; elseif(arr[mid] low=mid+1; else returnmid; } return-1; } *4.实现strcpy函数(*出现次数相当频繁 char*strcpy(char*dest,constchar*src) { assert((dest! =NULL)&&(src! =NULL)); char*address=dest; while((*dest++=*src++)! ='\0'); returnaddress; } char*strcpy(char*strDest,constchar*strSrc) { char*strDestCopy=strDest;//[3] if((strDest==NULL)||(strSrc==NULL))//[1] throw"Invalidargument(s)";//[2] while((*strDest++=*strSrc++)! ='\0');//[4] returnstrDestCopy; } *5实现strcmp函数 #include #include #include usingnamespacestd; intstrcmp(constchar*str1,constchar*str2) { assert((str1! =NULL)&&(str2! =NULL)); intret=0; /* 转化为unsignedchar是为了防止溢出 例如(char)0x7f-(char)0x80=255,(unsignedchar)0x7f-(unsignedchar)0x80=-1 */ while(! (ret=*(unsignedchar*)str1-*(unsignedchar*)str2)&&**str2! ='\0'&&*str1! ='\0') { str1++; str2++; } if(ret>0) ret=1; elseif(ret<0) ret=-1; returnret; } intmain(void) { cout< return0; } *6string类的编写 #include usingnamespacestd; classString { public: String(constchar*str=NULL);//普通构造函数 String(constString&other);//拷贝构造函数 ~String(void);//析构函数 String&operator=(constString&other);//赋值函数 String&operate+(constString&s1,constString&s2);//加法函数 private: char*m_data; }; //普通构造函数 String: : String(constchar*str) { if(str==NULL) { m_data=newchar[1]; *m_data='\0'; } else { intlenth=strlen(str); m_data=newchar[lenth+1]; strcpy(m_data,str); } } //拷贝构造函数 String: : String(constString&other) { intlenth=strlen(other.m_data); m_data=newchar[lenth+1]; strcpy(m_data,other.m_data); } //析构函数 String: : ~String() { delete[]m_data; } //赋值函数 String&String: : operator=(constString&other) { //检查自赋值 if(this=&other) { return*this; } //释放原有资源 delete[]m_data; //分配新的内存资源,并赋值 intlen=strlen(otehr.m_data); m_data=newchar[len+1]; strcpy(m_data,other.m_data); //返回本对象的引用 return*this; } //加法函数 String&operator+(constString&s1,constString&s2) { Stringtemp; deletetemp.data;//temp.data是仅含‘\0’的字符串 temp.data=newchar[strlen(s1.data)+strlen(s2.data)+1]; strcpy(temp.data,s1.data);//data为char*型的数据成员。 strcat(temp.data,s2.data); returntemp; } //便于理解上述代码,写出main函数 intmain(void) { Stringstr_a=newString();//调用构造函数 Stringstr_b=newString(“abc”); Stringstr_c=str_b;//调用拷贝构造函数 str_c=str_a;/赋值 Stringsrt_d; str_d=str_c+str_b; } 7.写出在母串中查找子串出现次数的代码。 思路: 从第一个字符开始查找,然后逐个比较两个字符串是否相同,直到子字符串结束都相同则表明找到一次,num+1,然后第二个字符开始。 。 重复 intcount(char*str,char*substr) { char*str1; char*str2; intnum=0; while(*str! ='\0') { str1=str; str2=substr; while(*str2==*str1&&(*str2! ='\0')&&(*str1! ='\0')) { str2++; str1++; } if(*str2=='\0') num++; str++; } returnnum; } *8.写函数完成内存的拷贝 一个内存拷贝函数的实现体 void*memcpy(void*pvTo,constvoid*pvFrom,size_tsize) { assert((pvTo! =NULL)&&(pvFrom! =NULL)); byte*pbTo=(byte*)pvTo;//防止地址被改变 byte*pbFrom=(byte*)pvFrom; while(size-->0) *pbTo++=*pbForm++; returnpvTo; } *9.将一个数字字符串转换为数字."1234"-->1234 #include usingnamespacestd; intf(char*s) { intk=0; while(*s! =‘\0’) { k=10*k+(*s++)-'0';//k每乘以1次10,则位数左移一位(如个位变成10位) } returnk; } intmain() { intdigit=f("4567"); cout< cin.get(); } 10.求1000! 的末尾有几个0 (用素数相乘的方法来做,如72=2*2*2*3*3);求出1->1000里,能被5整除的数的个数n1,能被25整除的数的个数n2,能被125整除的数的个数n3,能被625整除的数的个数 n4.1000! 末尾的零的个数=n1+n2+n3+n4; #include #defineNUM1000 intfind5(intnum) { intret=0; while(num%5==0) { num/=5; ret++; } returnret; } intmain() { intresult=0; inti; for(i=5;i<=NUM;i+=5) { result+=find5(i); } printf("thetotalzeronumberis%d\n",result); return0; } 11.写一个函数找出一个整数数组中,第二大的数。 constintMINNUMBER=-32767; intfind_sec_max(intdata[],intcount) { intmaxnumber=data[0]; intsec_max=MINNUMBER; for(inti=1;i { if(data[i]>maxnumber) { sec_max=maxnumber; maxnumber=data[i]; } else { if(data[i]>sec_max) sec_max=data[i]; } returnsec_max; } 12.用递归算法判断数组a[N]是否为一个递增数组。 递归的方法,记录当前最大的,并且判断当前的是否比这个还大,大则继续,否则返回false结束: boolfun(inta[],intn) { if(n==1) { returntrue; } if(n==2) { returna[n-1]>=a[n-2]; } returnfun(a,n-1)&&(a[n-1]>=a[n-2]);//递归的同时要保证上一次的条件成立 } 13.选择排序 算法思想简单描述: 在要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。 选择排序是不稳定的。 算法复杂度O(n2)--[n的平方]【外层循环n-1趟,内层(第i+1趟)循环n-i-1次】【对比冒泡排序: 外层循环n-1趟,内层(第i趟)循环n-i-1次】 voidselect_sort(int*x,intn) { inti,j,min,t; for(i=0;i 共n-1次*/ { min=i;/*假设当前下标为i的数最小(从0开始,逐步加1),比较后再调整*/ for(j=i+1;j { if(*(x+j)<*(x+min)) { min=j;/*如果后面的数比前面的小,则记下它的下标*/ } } if(min! =i)/*如果min在循环中改变了,就需要交换数据*/ { t=*(x+i); *(x+i)=*(x+min); *(x+min)=t; } } } 14直接插入排序 算法思想简单描述: 在要排序的一组数中,假设前面(n-1)[n>=2]个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。 如此反复循环,直到全部排好顺序。 直接插入排序是稳定的。 算法时间复杂度O(n2)--[n的平方]【直接插入,冒泡,选择排序的时间复杂度一样】 voidinsert_sort(int*x,intn) { inti,j,t; for(i=1;i 1~n共n-1次 { /*暂存下标为i的数。 注意: 下标从1开始,原因就是开始时,第一个数即下标为0的数,前面没有任何数,单单一个,认为它是排好顺序的,方便下面的for循环下标的书写。 */ t=*(x+i); for(j=i-1;j>=0&&t<*(x+j);j--)/*注意: j=i-1,j--,这里就是在下标为i的数后面有序列中找插入位置。 【这里的后面指的是右边】*/ { *(x+j+1)=*(x+j);/*如果满足条件就往后挪。 最坏的情况就是t比下标为0的数都小,它要放在最前面,j==-1,退出循环*/ } *(x+j)=t;/*找到下标为i的数的放置位置【改变参考点】*/ } } 看到这里 15冒泡排序 16.文件中有一组整数,要求排序后输出到另一个文件中。 #include #include usingnamespacestd; voidOrder(vector { intcount=data.size(); inttag=false;//设置是否需要继续冒泡的标志位 for(inti=0;i { for(intj=0;j { if(data[j]>data[j+1]) tag=true; inttemp=data[j]; data[j]=data[j+1]; data[j+1]=temp; } } if(! tag) { break; } } intmain(void) { vector ifstreamin("c: \\data.txt"); if(! in) { cout<<"fileerror! "; exit (1); } inttemp; while(! in.eof()) { cin>>temp; data.push_back(temp); } in.close();//关闭输入文件流 Order(data); ofstreamout("c: \\result.txt"); if(! out) { cout<<"fileerror! "; exit (1); } for(i=0;i { out< out.close();//关闭输出文件流 } } 17.输入一个字符串,将其逆序后输出。 (使用C++,不建议用伪码) #include usingnamespacestd; voidmain() { chara[50]; memset(a,0,sizeof(a)); inti=0,j; chart; cin.getline(a,50,'\n');
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序员 试题 编程