一道360面试题引发的思考
来源:互联网 发布:透视数据复制出来 编辑:程序博客网 时间:2024/04/28 10:37
一道360面试题引发的思考
还是360的一面,不同的面试官,从项目介绍,引发问相关知识点及解决问题思路,到随机问题的回答,涉及C++基础、纸上写程序、数据结构、操作系统(进程、线程,同步与互斥)、计算机网络(Http协议,TCP/UDP协议,加密、解密)、前沿知识等,合计时长大约70分钟以上。
后续我会把当时的笔记详细整理后呈现出来。
今天在Web程序开发的时候,用到了字节转换,忽而想起了自己过去两个月左右的一道面试题,豁然开朗了,顺着心气赶紧写下来。
题目要求:输入一个数代表多少字节,输出其对应的GBytes/Mbytes/Kbytes/Bytes。
通俗举例:1024000Byte= 1024000/1024=1000Kbytes;余数可以不考虑,取整即可。
说下当时自己的思路,首先,听到题目,这不是很简单吗?大致写了,可能考察点是不是宏定义、常量定义,因为常量const定义比宏定义有可调试,可有数据类型等的优势,选定常量定义的方法。
然后草草代码如下:
const long GBYTES = 1024*1024*1024;const long MBYTES = 1024*1024;const long KBYTES = 1024; void ByteTransformFun_init(longlByteVal){ longlByteRtn = 0; if(lByteVal< KBYTES) { printf("%ldBytes = %ld Bytes\n",lByteVal,lByteVal); } elseif(lByteVal >= KBYTES && lByteVal < MBYTES) { lByteRtn= (lByteVal)/KBYTES; printf("%ldBytes = %ld KBytes\n",lByteVal,lByteRtn); } elseif(lByteVal >= MBYTES && lByteVal < GBYTES) { lByteRtn= (lByteVal)/MBYTES; printf("%ldBytes = %ld MBytes\n",lByteVal,lByteRtn); } else { lByteRtn= (lByteVal)/GBYTES; printf("%ldBytes = %ld GBytes\n",lByteVal,lByteRtn); } }
明显,答完这道题后,一是由于比A4小不少的一块笔试试卷区域,写的有勾画现象;二是最关键的,考虑出题者的意图和实际判断的方式了吗?
有没有更简单的方法?面试官随即问道,没等我思考,他便指出,这种判断的冗余多次判断问题,说这是常识性的问题,不该出错。
问题考查点就在于:
第一点,临场分析问题的能力,要有思考,不能上来就顺着性子走,这样看似节约了时间,实际是南辕北撤;
第二点,平时或多或少遇到过类似的逻辑判断语句过,思考过如何精简程序,提高执行效率吗?这是平时所欠缺的,这点也体现了自己的积累不够。
正确代码及对比如下:初始为_init,正确代码为_new。并做了测试如下:
const long GBYTES = 1024*1024*1024;const long MBYTES = 1024*1024;const long KBYTES = 1024;int main(){void ByteTransformFun_init(long lByteVal);void ByteTransformFun_new(long lByteVal);void ByteTransformFun_pithy( long lByteVal);long lByteArray[5] = {150000000L,134000L,15000L,16008880L,20023400L};for(int i = 0; i < 5; i++){ByteTransformFun_init(lByteArray[i]);}printf("\n\n");for( i = 0; i < 5; i++){ByteTransformFun_new(lByteArray[i]);}printf("\n\n");for( i = 0; i < 5; i++){ByteTransformFun_pithy(lByteArray[i]);}return 0;}//思路-->写法void ByteTransformFun_new(long lByteVal){long lByteRtn = 0;if(lByteVal > GBYTES){lByteRtn = (lByteVal)/GBYTES;printf("%ld Bytes = %ld GBytes\n",lByteVal,lByteRtn);}else if(lByteVal > MBYTES){lByteRtn = (lByteVal)/MBYTES;printf("%ld Bytes = %ld MBytes\n",lByteVal,lByteRtn);}else if(lByteVal > KBYTES){lByteRtn = (lByteVal)/KBYTES;printf("%ld Bytes = %ld KBytes\n",lByteVal,lByteRtn);}else{printf("%ld Bytes = %ld Bytes\n",lByteVal,lByteVal);}}//多了n次判断,不简洁.void ByteTransformFun_init(long lByteVal){long lByteRtn = 0;if(lByteVal < KBYTES){printf("%ld Bytes = %ld Bytes\n",lByteVal,lByteVal);}else if(lByteVal >= KBYTES && lByteVal < MBYTES){lByteRtn = (lByteVal)/KBYTES;printf("%ld Bytes = %ld KBytes\n",lByteVal,lByteRtn);}else if(lByteVal >= MBYTES && lByteVal < GBYTES){lByteRtn = (lByteVal)/MBYTES;printf("%ld Bytes = %ld MBytes\n",lByteVal,lByteRtn);}else{lByteRtn = (lByteVal)/GBYTES;printf("%ld Bytes = %ld GBytes\n",lByteVal,lByteRtn);}}//博友jadedrip提供的算法,简介有力!佩服!void ByteTransformFun_pithy( long lByteVal ){std::cout << lByteVal << "Bytes = ";static const char* prx[]={ "B", "KB", "MB", "GB" };int i=0;for( ; lByteVal >= 1024 && i<3; ++i ){lByteVal = lByteVal >> 10; //等价byte = byte/1024;}std::cout << lByteVal << prx[i] << std::endl;}
明显_new比_init少了一半量的判断,且代码简洁、整齐划一。
【2013-1-22】博友jadedrip提供的ByteTransformFun_pithy(long lByteVal)实现方法,简介有力,用到了字符数组、循环、右移运算,估计这正是360面试官最想看到,佩服佩服!看到了差距,好好学习!谢谢这位博友!
这个面试题引起了我平时写程序没有考虑效率、思考少,能实现功能就好的缺点的深思。
希望对你也能有所帮助!
- 一道360面试题引发的思考
- 一道360面试题引发的思考
- 由一道面试题引发的思考
- 一道C面试题引发的思考
- 百度一道面试题引发的思考
- 一道面试题引发的思考
- 一道面试题引发的思考
- 一道面试题引发的思考
- 一道js面试题引发的思考
- 一道面试题引发的思考
- (续)一道面试题引发的思考
- 一道 JS 面试题引发的思考
- 一道面试题引发的思考
- 一道面试题引发的有关随机数的思考(1)
- 一道面试题引发的有关随机数的思考(2)
- 一道面试题引发的有关随机数的思考(3)
- 一道面试题引发的有关随机数的思考(4)
- 一道面试题引发的有关随机数的思考(5)
- Taking a screenshot in XNA 4.0
- cocos2d-x初探学习笔记(30)2.1新特性之CCClippingNode
- ios开发笔记 – 1 – 类的声明
- GDAL使用DEM数据计算地形指数
- Makefile工程管理
- 一道360面试题引发的思考
- css之自动换行
- Mat类中的rowRange和colRange的用法
- VIM中常用序列生成及数值转换
- 螺旋式成功法则
- SVG(Scalable Vector Graphics)
- 同步建模和顺序建模
- MyISAM InnoDB 区别
- ios开发笔记– 2 – 类之间互相调用