CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

学编程的人不能不看的好文章

楼主alfred_liu(慢化剂)2005-09-15 21:16:09 在 C/C++ / C++ 语言 提问

做为一名大四的学生,我面试过不少的单位,有成功的也有失败的,但是对我来说所有的失败在某种意义上都是一种成功,特别是我下面写的这些,写这篇文章的时候,我已经签了南京的一家软件公司,但是想起今年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运算速度快就把所有的问题都推给它去做,程序员应该将代码优化再优化,我们自己能做的决不要让CPU做,因为CPU是为用户服务的,不是为我们程序员服务的!”多么精辟的语言,我已经不想再说什么了!接着是第二个问题:    
   
    2),他要求我用一种技巧性的编程方法来用一个函数实现两个函数的功能n为如:  
   
  fn1(n)=n/2!+n/3!+n/4!+n/5!+n/6!    
   
  fn2(n)=n/5!+n/6!+n/7!+n/8!+n/9!    
   
    现在用一个函数fn(int   n,int   flag)实现,当flag为0时,实现fn1功能,如果flag为1时实现fn2功能!  
   
    他的要求还是效率,效率,效率!说实在话,如果我心情好的话我应该能给出一种比较好的算法,但我那时真的没有什么心思再想了,我在纸上胡乱画了一些诸如6!=6*5!的公式后直截了当的跟他说要他给出他的答案!面试官也没有说什么,给出了他的思路:  
   
    定义一个二维数组   float   t[2][5]存入[2!,3!,4!,5!,6!},{5!,6!,7!,8!,9!]然后给出一个循环:    
   
  for(i=0;i<6;i++)    
  {    
  temp=temp+n/t[flag];    
  }    
    最后得到计算值!呵呵,典型的空间换时间的算法!  
   
    这些总共花了50分钟的时间,还有十分钟我就跟他很随意的聊聊天,聊了一些编程以及生活的问题,那时的我已经很放松了,因为我知道这次面试结果只有一个:失败。5:30的时候面试官要我等通知,于是我离开了他们公司。这就是面试的整个经过!  
  问题点数:1、回复次数:25Top

1 楼xiaocai0001(高楼目尽欲黄昏/梧桐叶上萧萧雨)回复于 2005-09-15 21:20:06 得分 0

for(i=0;i<6;i++)    
  {    
  temp=temp+n/t[flag];    
  }    
  这个程序是得不到正确结果的Top

2 楼Salam2001(Upgrading : C++ and Data Structure ...)回复于 2005-09-15 22:47:48 得分 1

int   t[   2   ][   6   ]   存储   {   {   2!,   3!,   4!,   5!,   6!   },   {   5!,   6!,   7!,   8!,   9!   }   }  
   
  for   (   i   =   0;   i   <   6;   i   ++   )  
  {  
          temp   +=   n   /   t[   flag   ][   i   ];   //   我记得   x   +=   y   好像比   x   =   x   +   y   效率高  
  }  
  Top

3 楼Salam2001(Upgrading : C++ and Data Structure ...)回复于 2005-09-15 22:51:21 得分 0

呵呵   看错了,应该是   t[   2   ][   5   ],循环条件:   i   <   5  
  楼主也可能是笔误...  
  看了深有感触...  
  谢楼主共享经验...赞!Top

4 楼SLash1984(SLash)回复于 2005-09-15 22:55:46 得分 0

估计是   temp=temp+n/t[flag][i];    
  果然是角度不一样的算法啊!  
  Top

5 楼husl(胡少磊)回复于 2005-09-15 23:09:04 得分 0

 
  文章看过      
   
    一分     我要el    
  Top

6 楼MagicCarmack(MagiC++)回复于 2005-09-16 00:30:47 得分 0

也曾文章看过  
   
   
  后一种方法就是传说中的查表Top

7 楼MagicCarmack(MagiC++)回复于 2005-09-16 00:30:58 得分 0

值得学习。。。。。。。。。。。。。。Top

8 楼paupau(吉祥鼠)回复于 2005-09-16 00:49:56 得分 0

嗯,思考中  
  楼主高程都过了哈,大学中很努力吧?  
  Top

9 楼hoya5121(饿了就喝水)回复于 2005-09-16 15:42:07 得分 0

哦...Top

10 楼kobefly(科比--网络学习中)回复于 2005-09-16 16:11:19 得分 0

第一个题目,前几天  
  在讨论用十行以内代码写出的  
  而且用不到乘法的Top

11 楼luluweng(断翼)回复于 2005-09-16 16:46:39 得分 0

晕,第一个题目是数列求和啊!!!  
  不知道楼主当时是怎么想的,用数学方法算一下再做不就很简单了。估计太紧张了吧!Top

12 楼lonkil(www.vcfans.com)回复于 2005-09-16 21:13:03 得分 0

不错,学习中.......Top

13 楼jsjjms(专心研究嵌入式)回复于 2005-09-16 21:28:34 得分 0

在实际使用中这些都是一些简单的技巧.  
   
  楼主工作了就自然会经常碰到这些问题.  
   
  在学校很多东西学不到的.Top

14 楼greentest(铜都铜业QQ:331338630)回复于 2005-09-16 21:52:29 得分 0

什么呀,都是些废话,能解决问题的就是好同志,别管他是黑猫白猫Top

15 楼hundlom(托克维尔)回复于 2005-09-16 22:06:14 得分 0

一般都是动手在前,思考再后。  
  借鉴,谢谢。Top

16 楼heixuejun()回复于 2005-09-16 23:40:56 得分 0

学习ingTop

17 楼garlandz(流星街★童虎)回复于 2005-09-17 09:00:20 得分 0

这家公司的面试官这么强,有前途。Top

18 楼bombwang(王)回复于 2005-09-17 10:36:54 得分 0

dingTop

19 楼xnlcx(J2EE.Net)回复于 2005-09-17 10:40:38 得分 0

 
  不错,   学习中...Top

20 楼supera2z(求实)回复于 2005-09-17 11:03:23 得分 0

……  
  人生要永远都在学习中啊Top

21 楼guanlicome(楼下继续)回复于 2005-09-17 11:18:00 得分 0

ding,到面试时能发黑成这样就不错了Top

22 楼aillvend()回复于 2005-09-17 11:19:57 得分 0

不错,期待更多。。。Top

23 楼yuanyou(元友)回复于 2005-09-17 11:43:09 得分 0

学习....Top

24 楼yhbttfile(小兵)回复于 2005-09-17 11:49:48 得分 0

呵呵,看来你面世的公司是比较要求效率的。  
   
  面世的时候,个人觉得应该多角度考察被面世者。这么两道题可能会把部分真有实力的人拒之门外。  
  面世的时候,可以提醒一下被面世者。  
   
  第一题,其实的确可以更简单:  
  //   1-2+3-4+5-6+7......+n    
  int   fn2(long   par,   long   &res)    
  {    
  if(par<=0)    
  {    
  return   -1;  
  }  
  res   =   -1   *   par   /   2;  
  //   奇数  
  if((par   %   2)   !=   0)  
  {  
  res   +=   par;  
  }  
  return   0;  
  }    
   
  你提供的函数,有个地方是非常严重的:  
  直接调用exit,这是一个成熟的商业软件所不允许的;  
   
  你的程序,我修正一下:  
  //   1-2+3-4+5-6+7......+n    
  int   fn1(long   par,   long   &res)    
  {    
  if(par<=0)    
  {    
  return   -1;  
  }    
  res   =   0;  
  int   i(1),   flag(1);  
  while(i<=par)    
  {    
  res   +=   flag   *   i;    
  ++i;  
  flag   =   -flag;  
  }    
  return   0;  
  }    
   
  我提供的,也应该还可以优化。  
  Top

25 楼hmily0917(卖造钱机)回复于 2005-09-17 15:04:50 得分 0

yhbttfile(小兵)        
      果然厉害   代码效率很高   。  
   
  Top

相关问题

  • 学编程的人不能不看的好文章[转载]
  • 主题:学编程的不能不看的好文章[转]
  • 怎样学编程?
  • 怎样学编程?
  • 如何学编程?
  • 初学DLL编程
  • 学编程,看A片。
  • 〓★★〓 学编程,看A片 !!!!!!!!!
  • 灌水文章(学编程的一点心得)
  • 收集编程的文章

关键词

  • 函数
  • 算法
  • 程序员
  • 优化
  • cpu
  • 面试
  • 题目
  • 编程
  • fn
  • 效率

得分解答快速导航

  • 帖主:alfred_liu
  • Salam2001

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo