程序员宝典第20章

上传人:xzh****18 文档编号:46678563 上传时间:2018-06-27 格式:PDF 页数:23 大小:430.65KB
返回 下载 相关 举报
程序员宝典第20章_第1页
第1页 / 共23页
程序员宝典第20章_第2页
第2页 / 共23页
程序员宝典第20章_第3页
第3页 / 共23页
程序员宝典第20章_第4页
第4页 / 共23页
程序员宝典第20章_第5页
第5页 / 共23页
点击查看更多>>
资源描述

《程序员宝典第20章》由会员分享,可在线阅读,更多相关《程序员宝典第20章(23页珍藏版)》请在金锄头文库上搜索。

1、 第 20 章 编写程序实战题 编写程序实战题在 C/C+程序员的面试中占有的分量无疑是最重的。即便其他的面试题都可以完成的不错,但是编写程序题却出现错误甚至漏洞百出,面试的成绩无疑是很糟糕的。编写程序题往往会从程序员的基本功、编程习惯、程序设计思路、算法等各个方面考查程序员,多积累这方面的试题经验,在面试的时候能根据要求写出严谨高效的程序,面试通过的几率是非常大的。 面试题 301 写出删除一个单项链表某一个结点的算法 题目:已知一个单向链表的头,请写出删除其某一个结点的算法,要求先找到此结点然后删除。 【考题分析】 面试官考核了基础概念、基础结构和基础算法。这个看似简单的问题,对应聘者来说

2、,是对过往学习的一个考核。如果这个问题都勉强回答上来,那说明对待 C 基础,还有待继续学习。 【答案】 NODE *Delete(NODE *Head,int key) NODE* node1 = Head; NODE* node2 = NULL; if(node1-number=key) /链表头如果是结点直接处理 Head = Head-next; free(node1); return Head; else while(node1 != NULL) node2 = node1; if(node2-number=key) node1-next = node2-next; free(node

3、2); break; node1 = node1-next; return Head; 第 4 篇 C/C+面试题实战解析 278 面试题 302 用 1 分钱、2 分钱、5 分钱组成 1 元钱的方式 题目:用 1 分钱、2 分钱、5 分钱组成 1 元钱,请给出所有的组合方式。 【分析与答案】 本题考核应聘者如何能有效快速的给出解决方案。示例代码如下。 #include int main() for (int n5 =100/5 ; n5 = 0; -n5) for ( int n2 = (100-5*n5)/2; n2=0; -n2) printf( “5 分%d 个,2 分%d 个,1 分

4、%d 个n“, n5,n2, 100-5*n5-2*n2); /输出结果 还有另外一种解法,也输出了组合的个数,示例代码如下: #include using namespace std; int main() int m, n, k = 0; cout = 4) /4 年以后奶牛数量开始增多 if(iYear - iCnt) 3) /第 2 个 4 年开始后产的奶牛开始生新奶牛 lCowsNum += CalCowsNum(iYear - iCnt); else lCowsNum +; return lCowsNum; /返回奶牛总数 int main(int argc, char* argv

5、) int iYear = 0; printf(“Please input require years!n“); scanf(“%d“, /输入年数 printf(“In %d years, There is %d cows.n“, iYear, CalCowsNum(iYear); /输出结果 return 0; 面试题 304 写一个函数将链表逆序(Intel 面试题) 题目:已知链表的头结点 head,写一个函数把这个链表逆序。 【考题分析】 本题主要考核链表的基础知识。其中在进行逆序操作时,会涉及到 C 语言最关键的指 针操作,详细的实现代码参考下面的代码。 【答案】 函数代码如下:

6、Node * ReverseList(Node *head) /链表逆序 if ( head = NULL | head-next = NULL ) return NULL; /否则下面的就错了,一定要注意一些特定条件的判断,边界问题很重要,软件开发要注意对 异常分支的处理 /三个指针的方式结构比较清晰 Node *p1 = head; Node *p2 = p1-next; Node *p3 = p2-next; p1-next = NULL; while ( p3 != NULL ) p2-next = p1; /p2-next 为 p3,已经保存过了 p1 = p2; /p1、p2、p3

7、 都向前移动一个 p2 = p3; p3 = p3-next; p2-next = p1; /最末端结点挂在链上 第 4 篇 C/C+面试题实战解析 280 head = p2; return head; 面试题 305 将两个链表合并成一个链表依然有序 题目:已知两个链表 head1 和 head2 各自有序升序排列,请把它们合并成一个链表并 依然有序,并要求保留所有结点。 【考题分析】 本题也是考核链表的基础知识,是针对 C 语言数据结构的一种操作方式。这是 C/C+ 语言最基础的知识,应聘者在面试前一定要做好这方面的准备。 【答案】 实现代码如下: Node *Merge(Node *h

8、ead1, Node *head2) Node *head = NULL; /良好的习惯,指针要初始化为 NULL Node *tmp = head; if (NULL = head1) return head2; else if (NULL = head2) return head1; /从小到大,获得头结点 if (head1-data data) head = head1; head1 = head1-next; /注意更新的不一样 else head = head2; head2 = head2-next; while (head1 != NULL /挂接新结点 tmp = head1

9、; /更新当前最后一个结点 head1 = head1-next; /更新下一个待比较结点 else tmp-next = head2; tmp = head2; head2 = head2-next; if (NULL = head1) /挂接剩余部分 tmp-next = head2; else if (NULL = head2) 第 20 章 编写程序实战题 281 tmp-next = head1; 面试题306 用递归方法将两个链表合并成一个链表依然有序 (Autodesk 面试题) 题目:已知两个链表 head1 和 head2 各自升序排列,请把它们合并成一个链表依然有 序。这次

10、要求用递归方法进行。 【考题分析】 本题也是考核链表的基础知识,要求使用递归方法实现,实际上很容易从上题做一些 改动而得来,主要是注意退出的条件和迭代的条件。 【答案】 Node * MergeRecursive(Node *head1 , Node *head2) /退出条件是某链表结束 if ( head1 = NULL ) return head2; if ( head2 = NULL) return head1; Node *head = NULL; /指针置为 null if ( head1-data data ) head = head1; head-next = MergeRec

11、ursive(head1-next,head2); else head = head2; head-next = MergeRecursive(head1,head2-next); return head; /返回结果 面试题 307 给出 bool、int、float 指针变量与“零值”比较的 if 语句 题目:设变量名为 var,分别给出 bool、int、float 指针变量与“零值”比较的 if 语句。 【考题分析】 考查对 0 值判断的“内功”,bool 型变量的 0 判断完全可以写成 if(var=0),而 int 型 变量也可以写成 if(!var),指针变量的判断也可以写成 i

12、f(!var),上述写法虽然程序都能正确 运行,但是未能清晰地表达程序的意思。 一般情况下,如果想让 if 判断一个变量的“真”、 “假”,应直接使用 if(var)、if(!var), 表明其为“逻辑”判断;如果用 if 判断一个数值型变量(short、int、long 等),应该用 if(var=0),表明是与 0 进行“数值”上的比较;而判断指针则适宜用 if(var=NULL),这 是一种很好的编程习惯。 第 4 篇 C/C+面试题实战解析 282 浮点型变量并不精确,所以不可将 float 变量用“=”或“!=”与数字比较,应该设 法转化成“=”或“= - EPSINON) /数组用

13、来存放矩阵结点的值 void main() int aNN,n; printf(“input n:n“); /输入矩阵的行,列数 scanf(“%d“, printCube( getch(); void printCube(int aN,int n) int i,j,round=1; int m=1; for(i=0;i=n/2;i-) for(j=round;j=round;j-) aj-1=m+; for(j=i;jround;j-) aj-1round-1=m+; for(j=round;j (sizeof(int) * 8 - 1); 面试题 318 打印出当前源文件的文件名及当前行号

14、 题目:如何打印出当前源文件的文件名及源文件的当前行号? 【考题分析】 本题考核日常编程中最常用的格式符号,如果你没有很好的编程习惯,则本题会难倒 你,但其实这是最简单的代码编程基础。 【答案】 通常使用的就是_FILE_, _LINE_,在调试函数中利用“%s“,“%ld“,打印即可。 面试题 319 main()主函数执行完毕后是否会再执行一段代码 题目:main()主函数执行完毕后,是否可能会再执行一段代码?给出说明。 【考题分析】 main 主函数是所有程序必须具备的函数,是 C/C+人员一接触代码就知道的函数,那么这个问题会难倒很多人,尤其是平常不注意思考,不懂得问为什么的程序员。 【答案】 会执行另一些代码,进行处理工作。 第 20 章 编写程序实战题 291 如果需要加入一段在 main()函数退出后执行的代码,可以使用 atexit()函数,注册一个 函数。示例代码如下。 #include int atexit(void (*function“)(void); #include #include void fn1( void ), fn2( void ), fn3( void ), fn4

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号