|
“不要认为CPU运算速度快就把所有的问题都推给它去做,程序员应该将代码优化再优化,我们自己能做的决不要让CPU做,因为CPU是为用户服务的,不是为我们程序员服务的!”
做为一名大四的学生,我面试过不少的单位,有成功的也有失败的,但是对我来说所有的失败在某种意义上都是一种成功,特别是我下面写的这些,写这篇文章的时候,我已经签了南京的一家软件公司,但是想起今年2月21日我面试苏州台湾的IT公司的经历联想到我们现在学习编程的一些情况我真的深有感触,这次面试使我深深的体会到了失败但也收获了很多。 我要说的将分成三部分,1.是 我面试的具体经过2.是由面试想到的3.现今我应该做的。当然这些话很大程度上是我个人的意见,不可能完全得到大家的赞同,所以在某些观点上如果哪位朋友觉得跟我的有很大出入,请不要介意,也不要对我攻击,就当我没有说过,欢迎和我联系共同探讨这些问题!我的EMAIL:wutao8@263.net 1.面试经过 大约在年前我接到了台湾瑞晟(Realtek)苏州公司的面试通知,通知我2月21日到苏州工业园区面试,接到面试后的几天我把一些专业课温习了一遍,特别是C++和数据结构,由于大学几年里,我一直专研这些方面,加上通过了高级程序员的考试,对于一些常用的算法我差不多也达到了烂熟于胸的地步,当时的感觉是如果问了我这些方面的问题我应该是没有问题的! 21日那天我被安排在4:30面试,由一位技术人员单独给我面试,在问了一些简单的问题之后他给我出了一道编程题目,题目是这样的: (由于具体面试的题目比较烦琐,我将其核心思想提取出来分解成了两个独立的简单的问题,有可能问题分解的不当,请大家见谅,实际面试了一个的问题但比其复杂很多,而且涉及一些高等数学变换) 1) 写一个函数计算当参数为n(n很大)时的值 1-2+3-4+5-6+7......+n 哼,我的心里冷笑一声!没想到这么简单,我有点紧张的心情顿时放松起来! 于是很快我给出我的解法: long fn(long n) { long temp=0; int i,flag=1; if(n<=0) { printf("error: n must > 0); exit(1); } for(i=1;i<=n;i++) { temp=temp+flag*i; flag=(-1)*flag; } return temp; } 搞定!当我用期待的目光看着面试官的时候,他微笑着跟我说,执行结果肯定是没有问题!但当n很大的时候我这个程序执行效率很低, 在嵌入式系统的开发中,程序的运行效率很重要,能让CPU少执行一条指令都是好的,他让我看看这个程序还有什么可以修改的地方, 把程序优化一下!听了这些话,我的心情当时变的有点沉重,没想到他的要求很严格,之后我对程序进行了严格的分析,给出了改进了的方案! long fn(long n) { long temp=0; int j=1,i=1,flag=1; if(n<=0) { printf("error: n must > 0); exit(1); } while(j<=n) { temp=temp+i; i=-i; i>0?i++:i--; j++; } return temp; } 虽然我不敢保证我这个算法是最优的,但是比起上一个程序,我将所有涉及到乘法指令的语句改为执行加法指令,既达到要题目的要求而且运算时间上缩短了很多!而代价仅仅是增加了一个整型变量!但是我现在的信心已经受了一点打击,我将信将疑的看者面试官,他还是微笑着跟我说:"不错,这个程序确实在效率上有的很大的提高!"我心里一阵暗喜!但他接着说这个程序仍然不能达到他的要求,要我给出更优的方案!天啊!还有优化!我当时真的有点崩溃了,想了一会后,我请求他给出他的方案!然后他很爽快的给出了他的程序! long fn(long n) { if(n<=0) { printf("error: n must > 0); exit(1); } if(0==n%2) return (n/2)*(-1); else return (n/2)*(-1)+n; }
搞笑,当时我目瞪口呆,没想到他是这个意思,这么简单的代码我真的不会写吗,但是我为什么没有往那方面上想呢!他说的没有错,在n很大很大的时候这三个程序运行时间的差别简直是天壤之别!当我刚想开口说点什么的时候,他却先开口了:"不要认为CPU运算速度快就把所有的问题都推给它去做,程序员应该将代码优化再优化,我们自己胦#.. 9.*.b:e9dhY/9o N:/"y. 9.*+XN9d9`f. 9-Y*9ki(y&yifh!o 9.*+y.i)+. 9.* yn"9a:h9..+9/* yn"9c+"i)iye+k9/jy yn"9.." ,9dk*n!9amb9d9eb9d#d"9df`y.*.cm yn"9.""y. 9, ,9f."c`yg*9"y.9ojy+#/9."ny $y+m9o:`a- yn"9nm.%9d9.fiy.9`I/ag*9.cm9c' 9.#y"yo9.g*9f+9.9d#ykiob,9$I+"j:` $9b幮!nm.%9n:+ $z+#z/剈 9d#, .9c+9. 9d#yc.#ze&I.)9.*nc9o9ioI/`#9kio 9cXN9n9c`yb!m.l:(c9l,yk9$9.h9)y` #9.9cm9ay.. 9i)...b9.9b!i&/$yb!d9+) i9.#y+":-':+`9g*9. 9d#yd9.9d#y/cy)y., f .#y+c9l:-l$yn*:a,z-j$z+9o)zgh`d 9d#+#y.N/a+c#9m$y.#y`d"yi&l$y.. 9-+m-9i-9+/aom9c,y.*aN$ydfNamk`$y,9/#yh."gh`&/a+#yz+f.$y"9c)"y. : kd9'. : kd9y* `'#y+b,9g*9."gh$y!. 9/9.g+ /a+h$y`fe&y.% !z++hyd$Ig*9+h$yd:am9$&y.l,z,hy$ybczgh+ $y/+yf"y.%." 9ioyn$y.g$y-9nl&. 9/ y$yg*9l,y-mhnl-mNo9ml,yayb,:/9&y$yg*9."`ml%9c9./b$y.#y`d9.b /a+9$y."*g+9c 9.#f."$y. 9k/&k$yKy. 9d#y/&9/k+yn"H |