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

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

    我同事面试的,一家供应商推送过来的候选人,3年工作经验,简单的寒暄之后正式开始了技术面试。有必要和大家分享下项目组是怎么招聘的哈,
  1. 一般情况下会先让候选人介绍一下自己吐舌头
  2. 针对简历上提到的项目会大概了解下情况,在心里对候选人有个定位,
  3. 之后(而且也是必可不少的),白板上写代码,
  4. 如果觉得候选人还不错的话,面试官会介绍一下项目的情况,
  5. 然后反馈给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是什么意思, 侮辱我吗?
    其实同事还在起头上,我想了想这道题能做出来不是很难,但是想做好不容易,想做的巧妙估计还是有点难度的。我们先看核心部分,
  1. 一个求余,123456 % 10 会得到6, 12345 % 10 会得到5, 1234 % 10 会得到4, 123 % 10 会得到3, 12%10得到2, 1%10 = 1.
  2. 一个取模,123456 /10 得到12345, 12345/10得到1234, 1234/10得到123, 123/10得到12, 12/10得到1, 1/10得到0
  3. 还有一个是循环 只要模 > 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. 123456
2. 0
3. -2343
4. int.max
5. int.min
6. int.max-1
7. int.min +1
8. 随机一个数,转两次,在没有异常的情况下是否互逆 

好了,欢迎大家关注我的公众号,还有我的系列视频教程, 数据结构与算法 微软经典算法面试题辅导。大家有什么更好的解法,也欢迎讨论哈。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值