设为首页收藏本站

爱吱声

 找回密码
 注册
搜索
查看: 3605|回复: 9
打印 上一主题 下一主题

[时事热点] 当ChatGpt走进面试间

[复制链接]
  • TA的每日心情
    奋斗
    2018-9-13 10:09
  • 签到天数: 1 天

    [LV.1]炼气

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-12 15:31:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    看了Chatgpt通过谷歌面试的新闻(https://www.infoq.cn/article/fxYffzDJGkdBofdUtsQH)以后,我暗中冷笑不已:什么年代了,还用leetcode这种机械的面试题,活该如此!Chatgpt幸亏没开放大陆使用,否则落在我的手里,要你好看!

    要你好看!

    早年间我觉得leetcode面试还不错,有空自己也喜欢去刷,找到感觉了刷得还挺来劲。忝列面试官行列时候也会出leetcode的题目,但是只用easy题目,我觉得hard题目已经不是考察编程能力了,而是考察背题能力。最常用的是这个:
    一个数组长度为[2n + 1],包括n+1个数字,其中只有一个数字是单独出现,其他数字都会出现两次,例如[1, 2, 2, 1, 3] ,请找出只出现一次的数字。
    它的好处在于:
    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。
    题目:一个数组长度为[3n + 1],包括n+1个数字,其中只有一个数字是单独出现,其他数字都会出现三次,例如[1, 2,  2,1, 1, 2, 3] 。请找出只出现一次的数字。
    回答
    1.     public static int findSingleNumber(int[] arr) {
    2.         int[] bitSum = new int[32];
    3.         for (int i = 0; i < arr.length; i++) {
    4.             int bitMask = 1;
    5.             for (int j = 31; j >= 0; j--) {
    6.                 int bit = arr[i] & bitMask;
    7.                 if (bit != 0) {
    8.                     bitSum[j] += 1;
    9.                 }
    10.                 bitMask = bitMask << 1;
    11.             }
    12.         }
    13.         int result = 0;
    14.         for (int i = 0; i < 32; i++) {
    15.             result = result << 1;
    16.             result += bitSum[i] % 3;
    17.         }
    18.         return result;
    19.     }
    复制代码

    设计分数
    分数题目做得中规中矩,但是实际面试当中能做到这个程度的大约10%,考虑到编程速度可以给个B+。toString写得很好,分子为0的判断其实我也没想到;构造函数通过抛出异常避免分母为0做得也很好,不过这个应该都能想到。
    1. public class Fraction {
    2.     private int numerator;
    3.     private int denominator;

    4.     public Fraction(int numerator, int denominator) {
    5.         if (denominator == 0) {
    6.             throw new IllegalArgumentException("分母不能为0");
    7.         }
    8.         this.numerator = numerator;
    9.         this.denominator = denominator;
    10.     }

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

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

    21.     public Fraction multiply(Fraction fraction) {
    22.         int numerator = this.numerator * fraction.numerator;
    23.         int denominator = this.denominator * fraction.denominator;
    24.         return new Fraction(numerator, denominator);
    25.     }

    26.     public Fraction divide(Fraction fraction) {
    27.         int numerator = this.numerator * fraction.denominator;
    28.         int denominator = this.denominator * fraction.numerator;
    29.         return new Fraction(numerator, denominator);
    30.     }

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

    35.     private int gcd(int a, int b) {
    36.         if (b == 0) {
    37.             return a;
    38.         }
    39.         return gcd(b, a % b);
    40.     }

    41.     @Override
    42.     public String toString() {
    43.         if (this.numerator == 0) {
    44.             return "0";
    45.         }
    46.         if (this.denominator == 1) {
    47.             return String.valueOf(this.numerator);
    48.         }
    49.         return this.numerator + "/" + this.denominator;
    50.     }
    51. }
    复制代码

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

    时代变了,大人!

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

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

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

    评分

    参与人数 10爱元 +74 收起 理由
    蓦然回首 + 8
    七月群山 + 6 伙呆了
    松叶牡丹 + 4 伙呆了
    舒拔 + 10
    helloworld + 6

    查看全部评分

  • TA的每日心情
    开心
    12 小时前
  • 签到天数: 1716 天

    [LV.Master]无

    沙发
    发表于 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来动态判断系统的整数长度。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-1-2 23:51
  • 签到天数: 2 天

    [LV.1]炼气

    板凳
    发表于 2023-2-12 21:35:27 | 只看该作者



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

    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    15 小时前
  • 签到天数: 3272 天

    [LV.Master]无

    地板
    发表于 2023-2-12 22:21:33 | 只看该作者
    五月 发表于 2023-2-12 08:35


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

    不怕事大,强烈推荐给it公司
    回复 支持 1 反对 0

    使用道具 举报

  • TA的每日心情
    奋斗
    2023-12-3 11:19
  • 签到天数: 1111 天

    [LV.10]大乘

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

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-4-20 05:43
  • 签到天数: 300 天

    [LV.8]合体

    6#
    发表于 2023-2-13 08:11:26 | 只看该作者
    我把你的题目copy进去,这次ChatGPT明显是审题不周。

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

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

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


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

    # 读取数据
    arr = [1, 2,  2,1, 1, 2, 3]

    # 方法一:使用哈希表来实现
    def find_single_with_hash(arr):
        # 初始化一个哈希表
        hash_map = {}
        for ele in arr:
            if ele in hash_map:
                hash_map[ele] += 1
            else:
                hash_map[ele] = 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))

    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2018-9-13 10:09
  • 签到天数: 1 天

    [LV.1]炼气

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

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

    使用道具 举报

  • TA的每日心情
    奋斗
    2018-9-13 10:09
  • 签到天数: 1 天

    [LV.1]炼气

    8#
     楼主| 发表于 2023-3-19 17:10:13 | 只看该作者
    五月 发表于 2023-2-12 21:35


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

    GPT4再发展发展,估计有戏!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2018-9-13 10:09
  • 签到天数: 1 天

    [LV.1]炼气

    9#
     楼主| 发表于 2023-3-19 17:11:12 | 只看该作者
    被明月兮佩宝璐 发表于 2023-2-13 00:00
    这才出来1个多月吧,现在这个已经很超出预期了。就和人类与AI下象棋一样,随着时间,AI的进步远远快于人类 ...

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

    使用道具 举报

  • TA的每日心情
    奋斗
    2018-9-13 10:09
  • 签到天数: 1 天

    [LV.1]炼气

    10#
     楼主| 发表于 2023-3-19 17:12:13 | 只看该作者
    可梦之 发表于 2023-2-13 08:11
    我把你的题目copy进去,这次ChatGPT明显是审题不周。

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

    出错的情况我还没遇到过,不过chatGPT确实会没次都不一样。
    尤其是最后一题的错误,很有文心一言的风格哈哈哈
    回复 支持 反对

    使用道具 举报

    手机版|小黑屋|Archiver|网站错误报告|爱吱声   

    GMT+8, 2024-11-16 15:02 , Processed in 0.036699 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表