您的位置:首页 > 理论基础 > 数据结构算法

算法数据结构面试分享(十)这样的对白,面试者和求职者同样郁闷

2018-03-30 21:29 330 查看
     今天和大家分享一场发生在我身边的面试,事情就发生在今天下午。本来周五了,大家的心情应该无比欢畅,终于迎来了周末。可是这场面试和这样的对白,面试者和求职者同样郁闷


    我同事面试的,一家供应商推送过来的候选人,3年工作经验,简单的寒暄之后正式开始了技术面试。有必要和大家分享下项目组是怎么招聘的哈,一般情况下会先让候选人介绍一下自己


针对简历上提到的项目会大概了解下情况,在心里对候选人有个定位,
之后(而且也是必可不少的),白板上写代码,
如果觉得候选人还不错的话,面试官会介绍一下项目的情况,
然后反馈给HR,接下来的事情就是HR去处理了,基本上是面试给点是否聘用的建议
    当然,可能会有很多轮。有时候会安排在一天,或者一周内完成的都有哈。接着说回面试哈。给了候选人一只Mark笔,会议室里有很长的玻璃墙。然后我同事说,给你一个整数,你帮我反转一下,比如说 123456 =》 654321.    接下来发生的事情让我同事很气愤,没有被尊重的感觉(后来我想了想,这是意料之中的,只是我同事不了解候选人的实际情况罢了)。候选人二话没说,开始写起了代码,愣了5分钟,偌大的白板上就那么几行,写了又擦擦了又写寥寥无几的几行代码,大体是这样的。    int n = 0; 
   for(n = 0; n < 6 ; n ++){} 接下来发生的事情大家应该能想的到。 我同事开始很不解的开始问了,为什么 n < 6呢?大家想想,候选人为什么这么写,如果你能理解的话,你就知其所以然了。     “那这样吧,我给你一个方法,假设刚才的方法已经写好了,你能帮我测试一下吗?接口是这样的  public int Revert(int number);"    候选人说: 123456.     一番沟通下来,双方存在巨大的沟通障碍。接下来就听我同事回来和我们吐槽了,“今天真是遇到了奇葩

”     其实我在想,候选人更郁闷。被莫名其妙的虐了一把,连自己面的什么项目组,公司会给什么样的待遇都不知道,就这样委屈的被打发了(哈哈,你们说是不是?)     好了,说到这里,我们一块来总结一下哈,先同情下求职者:     1. 这哥们估计很闷,啥都放心里,想什么也不说出来,希望以后面试中调整自己的状态,生活中和工作中都积极一些哈     2. 方法没有从签名开始写,多数据结构和算法没有过系统的学习,至少没有学习过别人都是怎么面试的     3. 平时实践少了,很少给别人提供库函数,估计也很少调用API,所以上来就是for     4. 不关心需求,估计之前的工作也就copy & past, 或者写点简单的前端,对需求不敏感,没有看到他针对于需求做有效的讨论     5. 定义 n < 6, 可能是因为例子中给的是123456, 不知道算法是解决一般问题的     6. 不了解测试,估计单元测试都没做过
想知道更多面试技巧,算法与数据结构知道,欢迎大家访问我的在线课程
我们再看看题目哈,看完你就知道面试官为啥也很生气了。 给你整型你给我返回一个翻转的整型,给你123456能处理,123肯定也能处理, 正数能处理,负数应该也能处理。带符号的能处理,不带符号的应该也可以处理。如果是因为越界异常,你应该给我返回一个友好的消息,让我知道到底发生了什么吧。 你给我写了6是什么意思, 侮辱我吗?    其实同事还在起头上,我想了想这道题能做出来不是很难,但是想做好不容易,想做的巧妙估计还是有点难度的。我们先看核心部分, 一个求余,123456 % 10 会得到6, 12345 % 10 会得到5, 1234 % 10 会得到4, 123 % 10 会得到3, 12%10得到2, 1%10 = 1.
一个取模,123456 /10 得到12345, 12345/10得到1234, 1234/10得到123, 123/10得到12, 12/10得到1, 1/10得到0
还有一个是循环 只要模 > 0 我们第一次是 结果=余, 之后每次 结果 = 结果 * 10 + 余数, 是不是 ((((((6*10+5)*10)+4)*10+3)*10)+2)*10)+1
   这些都能处理了,估计我同事也就满意了,但是如果能考虑到负数,和越界问题,他可能就会惊喜了。而我们的最低标准就理解面试官,让他满意,再给他一点小小的惊喜。其实自己的水平比面试官的水平差太多,也说明这是一场不成功的面试。说明我们对职位没有搞清楚,是不是和自己的技术能力匹配了。     1. 处理正负问题, 开始判断输入是否为正负数,如果是负数我们把它乘-1变正数,在结果中再变回来就好了     2. 处理越界问题, 两个地方可能会越界。 输入值越界, 如果输入的是一个负的最小值,它的绝对值要比正的大的对吧,我们在处理负数转正数的时候就已经越界了,可以通过转换之后的数是正还是负来判断,如果依然是负数,那就越界了。第二个可能越界的地方再叠罗汉的时候,*10 + 余数的时候,如果加着加着变成负数了,说明越界了;    好了,那我们大家一起看一下最后的代码吧。
public static int Revert(int number)
{
int original = number > 0 ? number : number * -1;

if (original < 0) throw new Exception("It's out of range.");

int result = 0;

while (original > 0)
{
int yu = original % 10;
original = original / 10;

result = result * 10 + yu;
}

if (result < 0) throw new Exception("It's out of range.");

return number > 0 ? result : result * -1;
}
说到测试,我给大家一点思路啊。
1. 1234562. 03. -23434. int.max5. int.min6. int.max-17. int.min +18. 随机一个数,转两次,在没有异常的情况下是否互逆 

欢迎大家关注我的视频教程

欢迎大家关注我的公众号:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐