晨池 发表于 2023-2-12 15:31:44

当ChatGpt走进面试间

看了Chatgpt通过谷歌面试的新闻(https://www.infoq.cn/article/fxYffzDJGkdBofdUtsQH)以后,我暗中冷笑不已:什么年代了,还用leetcode这种机械的面试题,活该如此!Chatgpt幸亏没开放大陆使用,否则落在我的手里,要你好看!

要你好看!

早年间我觉得leetcode面试还不错,有空自己也喜欢去刷,找到感觉了刷得还挺来劲。忝列面试官行列时候也会出leetcode的题目,但是只用easy题目,我觉得hard题目已经不是考察编程能力了,而是考察背题能力。最常用的是这个:
一个数组长度为,包括n+1个数字,其中只有一个数字是单独出现,其他数字都会出现两次,例如 ,请找出只出现一次的数字。
它的好处在于:
1、很简单,写不出来直接拉黑送走;
2、次优解可以从时间复杂度也可以从空间复杂度上优化,有讨论空间,能做到这一步就可以通过了;
3、最优解还能做出来的应该是做过原题的,能讲清楚原理(位运算)的必然计算机基础扎实,应该给个高分;讲不清楚原理就要结合其他情况判断是不是作弊了……
4、给出最优解的还可以扩展一下,如果长度是3n+1要怎么做?
这道题适合应届生,Chatgpt来做肯定能给出最优解,但是第四部的扩展应该是搞不定的,这是我自己想的,网上应该没有。

对于工作三五年的再用这个题目就不合适了,我常用的是从知乎上看到的一个面试题:要求写一个类来表达数学上的”分数”,可以加减乘除、用作hashCode、转换成字符串和约分,比如2/3、8/13等等,不允许用辗转相除做约分。它的好处在于:
1、这是一个设计题,可以考察候选人的设计能力而且可以在20分钟左右完成;
2、可以考察数学基础能力,有不少英雄汉倒在加减乘除上;
3、分子、分母是否是用public final、分母为0的处理、hashCode和equals上等可以看出编程习惯;
4、如果用工厂方法代替构造函数应该是看过effective java的,可以展开;
5、加减乘除需要两个分母相乘,这时候的溢出处理就比较费脑子了;
6、toString的时候边界条件处理上也可以看出来细心程度。
这个题目交给Chatgpt的话,辗转相除应该会做,但是其他应该是不行的,毕竟这是一个主观题。

看得目瞪口呆

所以我有一个想法chatgpt是一个检查面试题好坏的标准:如果chatgpt都能做出来的面试题,肯定不是什么好面试题,好的面试题是chatgpt做不出来的面试题。
为了验证一下我自己的这两道题有多好,我把它出给了chatgpt,既然落在我手里,那就:“要你好看!”。

第一题的扩展
第一题不用说,原题直接给出了最优解,这是意料之中的。
但是我对自己的扩展题目还是很有信心的,没想到的是……chatgpt给出来了最优解,必须S。
题目:一个数组长度为,包括n+1个数字,其中只有一个数字是单独出现,其他数字都会出现三次,例如 。请找出只出现一次的数字。
回答
    public static int findSingleNumber(int[] arr) {
      int[] bitSum = new int;
      for (int i = 0; i < arr.length; i++) {
            int bitMask = 1;
            for (int j = 31; j >= 0; j--) {
                int bit = arr & bitMask;
                if (bit != 0) {
                  bitSum += 1;
                }
                bitMask = bitMask << 1;
            }
      }
      int result = 0;
      for (int i = 0; i < 32; i++) {
            result = result << 1;
            result += bitSum % 3;
      }
      return result;
    }
设计分数
分数题目做得中规中矩,但是实际面试当中能做到这个程度的大约10%,考虑到编程速度可以给个B+。toString写得很好,分子为0的判断其实我也没想到;构造函数通过抛出异常避免分母为0做得也很好,不过这个应该都能想到。
public class Fraction {
    private int numerator;
    private int denominator;

    public Fraction(int numerator, int denominator) {
      if (denominator == 0) {
            throw new IllegalArgumentException("分母不能为0");
      }
      this.numerator = numerator;
      this.denominator = denominator;
    }

    public Fraction add(Fraction fraction) {
      int numerator = this.numerator * fraction.denominator + fraction.numerator * this.denominator;
      int denominator = this.denominator * fraction.denominator;
      return new Fraction(numerator, denominator);
    }

    public Fraction subtract(Fraction fraction) {
      int numerator = this.numerator * fraction.denominator - fraction.numerator * this.denominator;
      int denominator = this.denominator * fraction.denominator;
      return new Fraction(numerator, denominator);
    }

    public Fraction multiply(Fraction fraction) {
      int numerator = this.numerator * fraction.numerator;
      int denominator = this.denominator * fraction.denominator;
      return new Fraction(numerator, denominator);
    }

    public Fraction divide(Fraction fraction) {
      int numerator = this.numerator * fraction.denominator;
      int denominator = this.denominator * fraction.numerator;
      return new Fraction(numerator, denominator);
    }

    public Fraction simplify() {
      int gcd = gcd(this.numerator, this.denominator);
      return new Fraction(this.numerator / gcd, this.denominator / gcd);
    }

    private int gcd(int a, int b) {
      if (b == 0) {
            return a;
      }
      return gcd(b, a % b);
    }

    @Override
    public String toString() {
      if (this.numerator == 0) {
            return "0";
      }
      if (this.denominator == 1) {
            return String.valueOf(this.numerator);
      }
      return this.numerator + "/" + this.denominator;
    }
}
分数题目当中,一个特殊的感受是chatgpt的题目能做多好,基本上和题目出的多好有很大关系。toString的时候本来只有简单的分子/分母形式,但是我增加了描述以后,就写得非常好。但是溢出情况上无论我怎么描述,它始终没有做任何处理,不知道为什么。溢出是可以通过加减乘除的时候先约分一轮来缓解的。

时代变了,大人!

Chatgpt的两道题表现,我给A,通过。
这次面试Chatgpt的感受,首先它在理解能力上的表现远远超过了我的预期,可以认为它如果理解错误了,那么就是我的表达问题。另外,它的面试表现,给我的感觉是取决于面试官的水平,面试官水平高,表达清楚,Chatgpt就做得好。它在谷歌拿了L3百万年薪,那么面试它的人水平应该不低的。从这个角度来看,本文的这场面试,与其是说我在给Chatgpt出题,倒不如说是Chatgpt在给我出题。这也意味着Chatgpt还是不能脱离人类的,它是程序员的好工具,但是仍然不能代替程序员。

当Chatgpt走进面试间……
如果它是候选人,那只是开启一场文字游戏;
如果它是面试官,那意味着程序员面试的时代变了:可以让候选人来使用Chatgpt写程序,这需要候选人思路清晰、表达准确(这个要求不低),Chatgpt才能写出正确的程序来,而且这个过程是高效、客观的。

将来,阿不,就是现在,可以考虑让Chatgpt来做面试官,至少代替面试的笔试部分,这是程序员面试的一种新形式,比用leetcode这种机械的面试题强多了。

数值分析 发表于 2023-2-12 17:22:36

本帖最后由 数值分析 于 2023-2-12 17:34 编辑

第一题最优解么?明显应该在开头构造一个长度为sizeof(int)*8的整数数组用来存所有的bitmask,然后每个数字与每个mask进行位与运算取每一位的值,而不是这么每一个数字都构造一遍bitmask啊。现在这样一共要多(3n+1)*(sizeof(int)*8-1)次左位移运算,而且不好并行。

还有一个可以改进的地方是答案假设了int型是32位,可以用sizeof来动态判断系统的整数长度。

五月 发表于 2023-2-12 21:35:27




小心被万恶的HR看见,于是决定用ChatGPT来评测大家的绩效。表现不好的一律毕业!

{:191:}

马鹿 发表于 2023-2-12 22:21:33

五月 发表于 2023-2-12 08:35


小心被万恶的HR看见,于是决定用ChatGPT来评测大家的绩效。表现不好的一律毕业!


不怕事大,强烈推荐给it公司

被明月兮佩宝璐 发表于 2023-2-13 00:00:16

这才出来1个多月吧,现在这个已经很超出预期了。就和人类与AI下象棋一样,随着时间,AI的进步远远快于人类,最终人类赢面无限趋向于零。按目前的趋势,很多衍生应用会诞生,重复性的无创造性的职位会被快速取代,翻译,文员,秘书,客服等等。配合Tesla人形机器,妥妥的低端人口增长加速器。

可梦之 发表于 2023-2-13 08:11:26

我把你的题目copy进去,这次ChatGPT明显是审题不周。

题目:一个数组长度为,包括n+1个数字,其中只有一个数字是单独出现,其他数字都会出现三次,例如 。请找出只出现一次的数字。

方法一:通过哈希表来实现。我们可以遍历数组,用哈希表记录每个数字出现的次数,如果某个数字只出现了一次,那么就找到了答案。

方法二:使用异或运算。对于每个数字,我们可以使用异或运算将其与之前的数字进行比较,如果最终的结果是非零的,那么就找到了只出现一次的数字。


用python实现这个程序
以下是用 Python 实现这个程序的示例代码:

# 读取数据
arr =

# 方法一:使用哈希表来实现
def find_single_with_hash(arr):
    # 初始化一个哈希表
    hash_map = {}
    for ele in arr:
      if ele in hash_map:
            hash_map += 1
      else:
            hash_map = 1
    # 遍历哈希表,找出只出现一次的数字
    for k, v in hash_map.items():
      if v == 1:
            return k
    return None

# 方法二:使用异或运算
def find_single_with_xor(arr):
    res = 0
    for ele in arr:
      res ^= ele
    return res

# 测试
print(find_single_with_hash(arr))
print(find_single_with_xor(arr))

晨池 发表于 2023-3-19 17:09:33

数值分析 发表于 2023-2-12 17:22
第一题最优解么?明显应该在开头构造一个长度为sizeof(int)*8的整数数组用来存所有的bitmask,然后每个数 ...

对我来说已经是超预期最优解了。。。这个扩展解法要我自己做估计得想一天,还不一定能想出来,我最早的时候认为3N+1是不能用位运算的:$

晨池 发表于 2023-3-19 17:10:13

五月 发表于 2023-2-12 21:35


小心被万恶的HR看见,于是决定用ChatGPT来评测大家的绩效。表现不好的一律毕业!


GPT4再发展发展,估计有戏!

晨池 发表于 2023-3-19 17:11:12

被明月兮佩宝璐 发表于 2023-2-13 00:00
这才出来1个多月吧,现在这个已经很超出预期了。就和人类与AI下象棋一样,随着时间,AI的进步远远快于人类 ...

GPT4发布以后,我觉得程序员这个行业的未来就会和围棋手一样,完全被AI代替了

晨池 发表于 2023-3-19 17:12:13

可梦之 发表于 2023-2-13 08:11
我把你的题目copy进去,这次ChatGPT明显是审题不周。

题目:一个数组长度为,包括n+1个数字,其中 ...

出错的情况我还没遇到过,不过chatGPT确实会没次都不一样。
尤其是最后一题的错误,很有文心一言的风格哈哈哈
页: [1]
查看完整版本: 当ChatGpt走进面试间