
闲来无事记录一个基础算法题语言用的是java。对面试基础算法题的感受现在的计算机程序员面试100%都有一道基础算法题难度不会搞的特别复杂烧脑但也不是简单到弱智对于应界生可能是一些基础的排序、查找、递归对于社招生可能是针对某个具体小问题的算法实践应用。这些算法题对于实际工作可能永远不会用到但是如果平时没怎么关注这类小题导致面试过程中卡壳那即使你实际工程应用都非常熟练多少也会影响面试结果。毕竟你是求职方是你去求别人的工作自然要拿出一些“求”的态度企业也需要通过这道小算法题把一个明显的门外汉挡在外面这也不能怪企业小题大做。 对于应聘者而言在重要的面试前抽一点时间刷几个题让大脑快速进入状态是有必要的。面试官考察的根本不是你会不会写回文、二分、DP考察这几项能力逻辑思维能不能把问题拆解理清边界条件编码基本功变量命名、循环、边界判空、数组越界、字符串处理很多人写代码都会漏空字符串、长度为 1、下标越界一眼看出编码习惯调试能力写完能不能自己发现 bug学习潜力算法学得动代表后续接触复杂中间件、并发、调优更容易上手。博弈技巧这里提供一个高风险但也高收益的博弈技巧合理合规范围内的博弈是值得提倡的。如果你算法笔试临场发挥不佳那你可以以请教口吻姿态问“能不能请教一下你这个题应该怎么做”面试官可能出现以下三种答复如果面试官顾左右而言它并且后续没有提供正确的算法答案。例如面试官回复“现在是我在面试你”。 那显然这论博弈中面试官输了明眼人都能看出来面试官害怕了他只能以自己作为面试官的主权来压制你指责你胡乱提问题进而倒逼你取消这个问题。如果他是有能力会解答这个题而选择不答那他失去了面试是双向交流的平等面如果他是不会解答这个题而选择不答那证明他自己技术不行还来考查别人最后被人看出来了还想以权谋私。 这个面试官大概率技术水平不行、人品也不行、脑子也不行这样的公司不值得去。并且面试官司也会把你这个要求当作一种冒犯并给你面试不通过以便维护自己的地位。如果面试官不回复你的这个请求既不说同意也不说不同意采取拖延战术。那说明这个面试官有点脑子而且有点人品做事会顾忌一些脸面这样的人可以共处。 这表明这位面试官在你提出要求后他已经同时看到这个问题的两种不同回答都对自己不利他的大脑在飞速思考如何应答这证明他有脑子但他可能疲于应付业务而近期没有足够精力应付这些算法题这都是正常的。 而面试官也会从你的这个请求中看出你的各种水平如技术能力水平、人品担挡、对业务的理解程度 进而认可你。如果面试官快速回答出这个题写出详细可运行代码。那这次面试大概率要凉了这证明这个面试官技术能力非常不错能做管理的同时保持对技术细节的详细掌握当然也有可能仅仅就只是面试官司最新也刷过这道题。 同时面试官也从你这个要求中看出你是一个技术能力不太行脑子里只会耍一些小聪明自己没做好的事只会往别人身上甩锅的人面试官极大概率从心眼里瞧不上这样的面试者进而给你不通过。综上以上在三种情况有两种情况是不通过只有一种情况是通过 所以说是高风险。那为什么说又是高收益 因为如果你没有后续的动作那通过“你不会做这道题”这件事就能证明你技术能力不行后续考虑不到其它隐情那证明你脑子也不行咯 技术题面试你不会解答嘛 这么简单的结论面试官又不傻自然给你下个这定论。 在你不会解答这道算法题的基础上提这个要求确实可以作为一个有效的应对既能更加了解对方是什么样的人也能表明自己的实力有脑子虽然题我不会但我不傻我知道你们公司平时也用不上这类小题目我不点破你希望你也保留基本的体面大家相安无事进而让对方相信你是有能力的。 就像你说农民不会用锄头你愿意相信这个农民会种地吗那不会用锄头但我会拖拉机犁地我不会挑粪但我会买合适的肥料来施肥这不行吗也是合情合理的。以我个人经验市面上的公司大部分会出现第一种情况这部分公司都是不要脸的里面的员工也是些脑子不太行的不去也罢少部分会出现第二种这部分值得更深入的交流更少有第三种情况如果有幸碰到并且人家愿意给你机会教你那你赶紧厚着脸去学没什么好挑的。最后面试完回去后赶紧反思总结一下作为一个程序员这种基础题反而不会做了自己平时都干什么去了还是得赶紧恶补一下 平时也可以适当关注一下这类小题练练手。 就算你说你会开拖拉机不会用锄头那你至少得知道哪里能锄哪里不能锄吧不然给你一辆拖拉机你把庄稼全犁了把杂草都留着这哪个公司敢收你题目找出一个字符串中的所有回文子串语言java回文串基础概念回文串Palindrome正向读和反向读完全一样的字符串。例子a、aa、aba、abba、abcba不是回文abc、abca两类回文奇数长度有一个中心点aba → 中心字符 b偶数长度中心是两个相邻字符abba → 中心 bb常见两种方案中心扩展法推荐效率较高回文分为奇数长度、偶数长度以每个位置为中心向外扩散暴力枚举双重循环遍历所有子串再判断是否回文理解简单但程序执行效率低方法一中心扩展法效果图:java 完整代码实现如下importjava.util.ArrayList;importjava.util.HashSet;importjava.util.List;importjava.util.Set;publicclassPalindromeSubstring{publicstaticvoidmain(String[]args){Stringsab314abcdcba88234543267;SetStringresultfindAllPalindromes(s);System.out.println(所有回文子串);for(Stringstr:result){System.out.println(str );}}publicstaticSetStringfindAllPalindromes(Strings){SetStringsetnewHashSet();// 去重if(snull||s.length()0){returnset;}intns.length();for(inti0;in;i){// 奇数长度回文中心 iexpand(s,i,i,set);// 偶数长度回文中心 i,i1expand(s,i,i1,set);}returnset;}/** * 中心向外扩展 */privatestaticvoidexpand(Strings,intleft,intright,SetStringset){while(left0rights.length()s.charAt(left)s.charAt(right)){Stringsubs.substring(left,right1);set.add(sub);left--;right;}}}方法二暴力枚举再判断运行效果图java 完整代码实现如下importjava.util.*;importjava.lang.*;importjava.io.*;// The main method must be in a class named Main.classMain{publicstaticvoidmain(String[]args){System.out.println(dist 的所有回文子串);SetStringresultgetAllChildStr(dist);for(Stringfruit:result){System.out.println(fruit);}}privatestaticfinalStringdistab314abcdcba88234543267;privatestaticfinalStringdist2abc123;privatestaticSetStringgetAllChildStr(Stringsource){SetStringresultnewHashSet();for(inti0;isource.length();i){for(intji1;jsource.length();j){Stringchildsource.substring(i,j);if(isBackText(child)){result.add(child);//System.out.print(child);//System.out.print(是\n);}else{//System.out.print(不是\n);}}}returnresult;}privatestaticbooleanisBackText(Stringsource){for(inti0;isource.length()/2;i){if(source.charAt(i)source.charAt(source.length()-1-i)){continue;}else{returnfalse;}}returntrue;}}