程序员面试修炼16阿里编程笔

设计软件有两种方法:一种是简单到明显没有缺陷,另一种复杂到缺陷不那么明显。

——托尼·霍尔

C++创建对象的两种方式

在栈上创建对象(ObjectsontheStack):

ClassNameObjName1,ObjName2(parameter01)//ButneverOjbName()

顾名思义,用这种方法创建的对象,内存分配到栈里(Stack)。使用“.”非“-”调用对象的方法。当程度离开对象的使用范围(如方法结束,一个程度块的 {}),范围内的栈中的对象会自动删除,内存自动回收。这是创建对象最简单的方式,与“intx=0;”是一样的。

在堆上创建对象(ObjectsontheHeap):

ClassName*obj1=newClassName();2ClassName*obj2=newClassName(parameter);3deleteobj1;4deleteobj2;

用这种方法创建的对象,内存分配到堆里(Heap)。一般使用“-”调用对象的方法。箭头操作符”-"将解引用(dereferencing*)和成员使用(memberaccess.)。

笔试/面试真题真题

题目描述(阿里-笔试题)

给定一个字符串S和有效单词的字典D,请确定可以插入到S中的最小空格数,使得最终的字符串完全由D中的有效单词组成,并输出解。

解题思路:

  1.先求字典里 单词的长度。

  2.然后按照这个长度,从前面开始切割。

  3.切割后查字典,若不存在,则去掉 一个字符。

  4.继续查找,重复3~4步骤必定能找到 的单次。

  5.若去掉完这个切割后的字符还没找到,那么就代表字典里面没有,直接跳出,输出n/a。

代码如下:

voidmincut(conststringstr,constsetstringdict){vectorstringvec;stringsrc=str;boolbS=true;//是否切割成功intmax_len=(*dict.begin()).size();//求字典 单词长度for(autoit=dict.begin();it!=dict.end();it++){if((*it).size()max_len)max_len=(*it).size();}while(!src.empty())//切割字符串{intcur=0;strings=src.substr(0,max_len);//每次都切割这么长的串boolbExits=dict.find(s)!=dict.end()?true:false;//查找if(bExits)//如果正好切割到一个 单词{vec.push_back(s);}else//否则去掉 一个字符继续查{while(!s.empty()bExits==false){cur++;s=src.substr(0,max_len-cur);bExits=dict.find(s)!=dict.end()?true:false;if(bExits){vec.push_back(s);}}}if(s.empty()){bS=false;break;}if(max_len-cur=src.size())src=src.substr(max_len-cur,src.size());elsebreak;}if(bS){for(inti=0;ivec.size();i++){coutvec[i];if(i!=vec.size()-1)cout;}coutendl;}elsecout"n/a"endl;}

写出高质量代码的10个建议

1.打好基础

写出高质量代码,并不是搭建空中楼阁,需要有一定的基础,这里我重点强调与代码质量密切相关的几点:

掌握好开发语言,比如做Android就必须对Java足够熟悉,《EffectiveJava》一书就是教授大家如何更好得掌握Java,写出高质量Java代码。

熟悉开发平台,不同的开发平台,有不同的API,有不同的工作原理,同样是Java代码,在PC上写与Android上写很多地方不一样,要去熟悉Android编程的一些特性,iOS编程的一些特性,了解清楚这些,才能写出更加地道的代码,充分发挥各自平台的优势。

基础的数据结构与算法,掌握好这些在解决一些特定问题时,可以以更加优雅有效的方式处理。

基础的设计原则,无需完全掌握23种经典设计模式,只需要了解一些常用的设计原则即可,甚至你也可以只了解什么是低耦合,并在你的代码中坚持实践,也能写出很不错的代码。

2.代码标准

代码标准在团队合作中尤为重要,谁也不希望一个项目中代码风格各异,看得让人糟心,即便是个人开发者,现在也需要跟各种开源项目打交道。标准怎么定是一个老生常谈的话题,我个人职业生涯中经历过很多次的代码标准讨论会议,C++,C#,Java等等,大家有时会坚持自己的习惯不肯退让。可现如今时代不一样了,Google等大厂已经为我们制定好了各种标准,不用争了,就用这些业界标准吧。

3.想好再写

除非你很清楚你要怎么做,否则我不建议边做边想。你真的搞清楚你要解决的问题是什么了吗?你的方案是否能有效?有没有更优雅简单的方案?准备怎么设计它,必要的情况下,需要有设计文档,复杂一些的设计需要有同行评审,写代码其实是很简单的事情,前提是你得先想清楚。

4.代码重构

重构对于代码质量的重要性不言而喻,反正我是很难一次把代码写得让自己满意、无可挑剔,《重构》这本书作为业内经典也理应人人必读,也有其他类似的教授重构技巧的书,有些也非常不错,遗憾的是我发现很多工作多年的同学甚至都没有了解过重构的概念

5.技术债务

知乎上最近有个热门问题《为什么有些大公司技术弱爆了?》,其实里面提到的很多归根结底都是技术债务问题,这在一些大公司尤为常见。技术债务话题太大,但就代码质量而言,我只想提一下不要因为这些债是前人留下的你就不去管,现实是没有多少机会让你从一个清爽清新的项目开始做起,你不得不去面对这些,你也没法完全不跟这些所谓的烂代码打交道。

因此我建议各位:当你负责一个小模块时,除了把它做好之外,也要顺便将与之纠缠在一起的技术债务还掉,因为这些债务最终将是整个团队来共同承担,任何一个人都别想独善其身,如果你还对高质量代码有追求的话。

作为团队的技术负责人,也要顶住压力,鼓励大家勇于做出尝试,引导大家不断改进代码质量,不要总是畏手畏脚,停滞不前,真要背锅也得上,要有担当。

6.代码审查

我曾经听过一些较高级别的技术分享,竟然还不时听到一些呼吁大家要做代码审查的主题,我以为在这个级别的技术会议上,不应再讨论代码审查有什么好,为什么要做代码审查之类的问题。同时我接触过相当多所谓国内一线互联网公司,竟有许多是不做代码审查的,这一度让我颇为意外。

这里也不想多谈如何做好代码审查,只是就代码质量这点,不客气地说:没有过代码审查经历的同学,往往很难写出高质量的代码,尤其是在各种追求速度的糙快猛创业公司。

7.静态检查

很多代码上的问题,都可以通过一些工具来找到,某些场景下,它比人要靠谱得多,至少不会出现某些细节上的遗漏,同时也能有效帮助大家减少代码审查的工作量。

Android开发中有Lint,Findbugs,PMD等 静态检查工具可用,通过改进这些工具找出的问题,就能对语法的细节,规范,编程的技巧有更多直观了解。

建议 与持续集成(CI),代码审查环境配套使用,每次提交的代码都能自动验证是否通过了工具的代码检查,通过才允许提交。

8.单元测试

Android单元测试,一直备受争议,主要还是原生的测试框架不够方便,每跑一次用例需要在模拟器或者真机上运行,效率太低,也不方便在CI环境下自动构建单元测试,好在有Robolectric,能帮我们解决部分问题。

单元测试的一个非常显著的优点是,当你需要修改大量代码时,尽管放心修改,只需要保证单元测试用例通过即可,无需瞻前顾后。

9.充分自测

有一种说法:程序员最害怕的是他自己写的代码,尤其是准备在众人面前show自己的工作成果时,因此在写完代码后,需要至少跑一遍基本的场景,一些简单的异常流。在把你的工作成果提交给测试或用户前,充分自测是基本的职业素养,不要总想着让测试帮你找问题,随便用几下就Crash的东西,你好意思拿给别人吗?

10.善用开源

并非开源的东西,质量就高,但至少







































我国 白癜风专家
白癜风问答



转载请注明:http://www.xxcyfilter.com/zytd/zytd/9949.html