V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
kehuduanbuxing
V2EX  ›  程序员

一人来一道拿手面试题

  •  
  •   kehuduanbuxing · 4 天前 · 3854 次点击

    先说我的题:

    返回值 response 是一个 map ,里面的结构类似于 {"key1":100, "key2":"100", "key3":[100, "100], "key4":{……}}

    手写一个函数,输入是 response ,输出要求把其中的数字 100 替换为数字 200 。

    这题用了十年了,面下来能写清楚这题的大概只有一半不到?

    51 条回复    2025-03-28 12:51:33 +08:00
    kandaakihito
        1
    kandaakihito  
       4 天前
    针对你这个面试题,我想到一个歪门邪道:把对象转换成 json ,然后把“100”批量替换成“200”,再转回来(
    tamwingjet666
        2
    tamwingjet666  
       4 天前
    我也是想到批量换,所以标准答案是啥
    learnshare
        3
    learnshare  
       4 天前   ❤️ 1
    "key3":[100, "100], // invalid value
    gefangshuai
        4
    gefangshuai  
       4 天前
    为什么传入 map 的时候没有直接传入 200 ?现在这样修改 map 岂不是垃圾代码?
    leokun
        5
    leokun  
       4 天前
    把 map 包装成 A 结构,在取 A 结构的属性时候判断下
    kehuduanbuxing
        6
    kehuduanbuxing  
    OP
       4 天前
    kehuduanbuxing
        7
    kehuduanbuxing  
    OP
       4 天前   ❤️ 1
    @gefangshuai 可以想象一个场景,是涉黄涉恐关键词替换为***
    rafa
        8
    rafa  
       4 天前
    不可以直接转字符串,然后正则修改么?
    corcre
        9
    corcre  
       4 天前   ❤️ 1
    js 的话写一个 dfs 用 Object.keys 遍历然后针对值/数组作处理, 如果是对象就继续丢 dfs?
    kehuduanbuxing
        10
    kehuduanbuxing  
    OP
       4 天前
    @tamwingjet666 简单点就递归。复杂点就正则,顺便考考正则的实现原理
    musi
        11
    musi  
       4 天前   ❤️ 2
    我选择转字符串然后 replaceAll
    我觉得自己写的代码优化应该赶不上 v8
    15855pm
        12
    15855pm  
       4 天前   ❤️ 2
    不讲武德解法:str(response).replace('100', '200')
    kehuduanbuxing
        13
    kehuduanbuxing  
    OP
       4 天前
    @15855pm 这样会替换到字符串 100 ,是没有考虑边界情况的解法。之后就开始问你 replace 方法的内部是如何实现的了👀
    DOLLOR
        14
    DOLLOR  
       4 天前
    我会把你的题目扩展一下:
    如果有新的需求,要把数字 200 替换为字符串"300",再过几天,又要把 0 和 1 替换为 false 和 true……
    这样肯定会没完没了,不可能每个替换规则都重写一个函数。
    所以请设计一个更通用的函数,输入是 response 和一个 callback: (key, value, object)=>any ,由调用者在 callback 里决定替换规则。
    felilong123
        15
    felilong123  
       4 天前
    @DOLLOR 哈哈哈,非常符合产品天天需求改来改去的真实场景
    gaoryrt
        16
    gaoryrt  
       4 天前
    1.正则验证小于 256 的自然数
    lesismal
        17
    lesismal  
       4 天前   ❤️ 8
    隔壁 /t/1121006 题目没什么歧义、简单算法也算实用常用。
    OP 这个题,恕我冒昧,这是近期看到的最垃圾的面试题,竟然还用了十年。
    BTW ,近期一共看了两道面试题,隔壁和这里。。。

    最基本的,没有标明语言,不同语言静态动态强弱类型对 map 的处理可是不大相同的,是否只是处理数值类型的 100 ,不同语言对类型的处理也是不大相同的,搞不好还要反射

    > 输出要求把其中的数字 100 替换为数字 200

    这句,不算严谨,字符串里的数字 100 算不算?反正我是不能确定出题者目的
    如果是说 数值类型的 100 ,就不会太歧义了
    kehuduanbuxing
        18
    kehuduanbuxing  
    OP
       4 天前
    @lesismal 语言和语言特性在我这里大概没这么重要,考察的是计算机基础。需求不明确可以沟通,也看看沟通能力。上来只会喷的,大概是做题做的思维固化了。
    bbao
        19
    bbao  
       4 天前
    [这题用了十年了,面下来能写清楚这题的大概只有一半不到?]
    说明题不好

    除了遍历 或 递归遍历 + 反射判断类型,比较 value 后替换罢了,没其他好办法。

    想到了前几天一个「格式化时间输出的面试题」给的一个答案:
    if value == 100 {
    value = 200 哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈
    }

    典型的场景:客户端 复杂无规则 payload JSON 请求体 + 客户端 payload 签名;服务器针对 payload 验签比较。
    tpeng9240
        20
    tpeng9240  
       4 天前
    这不就是各种类型判断,然后更新值,递归调用
    LLLeo
        21
    LLLeo  
       4 天前
    先解析转成对象,然后字符串替换处理
    pvnk1u
        22
    pvnk1u  
       4 天前
    这题有任何难度么,甚至还不如今天热搜贴那个计算时分秒的题
    woodfizky
        23
    woodfizky  
       4 天前
    题目不够清晰,很多限定条件没有说明白。

    比如,你这个 map ,没有限定是什么语言的 map ,也没有限定范围到底是只是 key 还是 value 。
    那假如我用 python 的 dict 去代入,key 也同样可以是 int 类型的。
    如果同时存在{100: 100, 200: 200},那替换完 key 重复直接就报错或者覆盖了。
    kinkin666
        24
    kinkin666  
       4 天前
    简单点吧,解析了再 BFS ,这样不会爆栈
    直接从字符串搞嘴巴讲讲可以,写有点麻烦
    gaoryrt
        25
    gaoryrt  
       4 天前
    @kehuduanbuxing #13 JSON.stringify(response).replace(/:100,/g, ':200,')
    lesismal
        26
    lesismal  
       4 天前   ❤️ 3
    > 语言和语言特性在我这里大概没这么重要,考察的是计算机基础。

    如果是不需要编码的题,你这样说没啥问题,说思路就行了。但你这个题目是“手写一个函数”,编码了,用什么语言本身就是很大问题了,比如用 c ?。。。

    > 需求不明确可以沟通,也看看沟通能力。上来只会喷的,大概是做题做的思维固化了。

    看你的题面,这种多是笔试题。即使面试题,也可以,而且别人也没说不沟通啊。

    但是这种简单问题,还要这么歧义,我只能认为是被我上一层回复后强行挽尊找的理由罢了。

    更何况,这是论坛,你发个这种题目出来指望大伙楼下挨个继续追问题目,浪费大家时间呢么?。。

    BTW ,我已经很多年没做过题了,我也从来不出这种题目去浪费别人时间。

    年轻时候遇到过很多笔试题面试题题目本身就 sb 的,我也以为是故意考察沟通能力,所以也都沟通过,沟通之后发现,绝大多数这种题目吧,就是出题人自己拎不清。甚至一些语言的语法题,还得面试现场我教他。
    更逗比的一些中小公司,自己工程里遇到的问题搞不定,拿来当面试题,我曾经就遇到过这种、然后面试时候解决方案优化方案一顿输出,给他们讲了一个多小时,面试官做笔记很细致。。。虽然这种我也不会去,但是技术交流也无所谓被他们白嫖,何况他们态度还恭敬的。。。


    > 上来只会喷的

    上一楼我只是比较平和指出你的题目的问题,我自己并不觉得是喷,为了避免让 OP 以为是喷,所以我用了“恕我冒昧”。

    OP 也不必太敏感,上来就否定我指出的实际问题。
    至于思维固化,这种题目用十年,是不是也该反思下到底是谁固化。
    RadishWind
        27
    RadishWind  
       4 天前
    取 ` :\s+100[,\]\}\s]`这样的来做替换? (不管是手写还是正则)
    kinkin666
        28
    kinkin666  
       4 天前
    @kinkin666 如果题目假设确定,确定 response 是 map ,那用 BFS 是最快最稳的,比正则快
    tenzinjamyangzhs
        29
    tenzinjamyangzhs  
       4 天前 via Android
    分享一下我的思路,kotlin ,遍历这个 map ,得到所有 second 为数字的 index ,记录成一个 indexlist ,再把所有是数字的 second 取出组成一个 numberlist ,再遍历这个 numberlist ,把每个元素都转成 string ,用 string.contains 获取所有包含 100 的元素的 index ,组成 100indexlist ,剩下的就是把对应 string 里的 100 换成 200 再转成数字,再根据 index 位置替换原 map 的相应内容最后返回。
    chen0520
        30
    chen0520  
       4 天前   ❤️ 1
    正则替换秒了
    JerryCanDo
        31
    JerryCanDo  
       4 天前
    JSON.stringify(Object.fromEntries(response)).replace(/100/g, 200)
    Guidoo
        32
    Guidoo  
       4 天前
    我之前面试外包,扁平数据转 Tree 函数,面了大概有 40-50 人吧,没有一个人能写出来的
    wyntalgeer
        33
    wyntalgeer  
       4 天前
    @kehuduanbuxing #7 所以关键词在拼 json 的适合为什么不替换成***?
    pkoukk
        34
    pkoukk  
       4 天前
    啥样的场景,需要在 map 没有序列化成对象之前,就要操纵修改里面的内容的?
    能想出的脏活,看得出贵公司平时的业务也有点脏,告辞。
    iOCZS
        35
    iOCZS  
       4 天前
    其实吧,转 JSON ,直接逆序扫描字符串,原地替换也能实现。
    lyxxxh2
        36
    lyxxxh2  
       4 天前
    一开始我想转字符串替换,但是感觉不够稳健。 (没注意有 100 是字符串,不过正则对我不难)
    还是根据"类型处理吧",虽然多了些代码,但是稳健。
    过了几分钟后,后着看数组类型,好像可以递归啊
    ```
    const replace => (data,need_str,replace_str){
    return data.map((key,item) => {
    if(item === need_str){
    return {
    'key': item.replace(100,200)
    }
    } else if(数组){ // 递归
    return replace(item,need_str,replace_str)
    }
    return {xx} // 不用替换
    })
    }
    ```
    lidong1041
        37
    lidong1041  
       4 天前
    @15855pm 这样好像不太行,1000 会被替换为 2000 ,2100 会替换为 2200 ,
    guanzhangzhang
        38
    guanzhangzhang  
       4 天前
    ```
    echo '{"key1":100, "key2":"100", "key3":[100, "100], "key4":{……}}' | sed -r 's#([:\[])100(,*)#\1200\2#g'
    ```
    qcbf111
        39
    qcbf111  
       4 天前
    c# 说说解决办法。
    1.需要在当前方法栈分配一个小型字典。
    2.如何在字典遍历期间删除其中某些元素,除了再用一个临时结构保存还有哪些。
    3.在一个正方形区域内有一百万个随机分布位置的单位,如何标记另一个小正方形圈中了的单位,如果是小圆形,小不规则四边形又如何找出范围内单位。
    main1234
        40
    main1234  
       4 天前
    这题的意义在哪里?正确的解法可以分享下嘛
    baran
        41
    baran  
       4 天前
    ```javascript
    function replaceNumber(response) {
    return new Proxy(response, {
    get(target, prop, receiver) {
    const value = Reflect.get(target, prop, receiver);
    if (value === 100) {
    return 200;
    }
    if (value === "100") {
    return "200";
    }
    if (Array.isArray(value)) {
    return value.map(item => replaceNumber(item));
    }
    if (typeof value === 'object' && value !== null) {
    return replaceNumber(value);
    }
    return value;
    }
    })
    }
    ```
    panbeta
        42
    panbeta  
       4 天前
    这个题目挺好,贴近日常工作,也能考察面试者对边界条件的考察。
    首先这个 Map 是非单一对象的,里面包含 Integer String Map Array 。

    题目是替换所有的 100 -> 200, 其实我们只需要处理 String 和 Integer 类型的数据就可以了。遇到 Map 和 Array 的话递归调用即可。
    假设只替换 "100" -> "200",不考虑 "100100100" -> "200200200" 这种情况。

    差不多一个递归函数 遍历 Map 的 AllKeys ,if 判断 Value 类型,然后 replace 就行。
    fenghoer
        43
    fenghoer  
       3 天前
    100 有数字也有字符串, 替换时还要排除 "100"
    edisonwong
        44
    edisonwong  
       3 天前
    我想着尝试用一条正则直接解决:同时排除 \".*100.*\" 字符串的情况,但想了想....真写出来,后人也难以维护或者写一大段注释说明这条正则含义,还不是按上面说的哈哈哈
    keshawnvan
        45
    keshawnvan  
       3 天前
    // 1 、编程:假设有一个 A 站点,每次登陆的时候都会记录用户的登陆信息日志(假设存储在数据库中),
    // 对象类型是 User ,有 3 个字段:userId, userName, loginTime
    // 需求:统计最近 10 天(每天约 100 亿条日志)
    // 登陆最频繁的 10 个用户,并输出这 10 个用户各登陆多少次
    // 要求:a. 不可直接使用 SQL 统计,请使用 JAVA 代码编写
    // b. 功能完备,逻辑正确
    ghostss
        46
    ghostss  
       3 天前
    递归:
    def transform_response(response):
    def process(data):
    if isinstance(data, dict):
    return {k: process(v) for k, v in data.items()}
    elif isinstance(data, list):
    return [process(item) for item in data]
    elif isinstance(data, int) and data == 100:
    return 200
    else:
    return data
    return process(response)
    htxy1985
        47
    htxy1985  
       3 天前
    主贴不是说一人一道题吗,我来收题的,怎么全是解题的
    kinkin666
        48
    kinkin666  
       3 天前
    @keshawnvan 主要是要防止内存炸了,以下是思路,叫豆包写能写的差不多

    为第一天建立一个顺序存储文件里面存定长记录,格式为 %40s-%020d ( userId-次数)
    扫两遍,第一遍把当天所有的用户名找出来,形成记录( userId-0 )
    然后调用外排序(按 userId ,不让用就写归并排序)
    第二遍扫表,因为记录定长,可以二分查找方便地定位并累加次数

    循环剩下天数,迭代处理,然后归并替代上一天的文件,相当于最多只会同时存在两个记录文件,一个归并文件

    至此,形成了( userId-次数)文件,然后就是扫一遍用堆 topK 。

    可以不按天来,按 100w 条记录这样形成一个文件,文件大小会更均匀
    这个思路也可以多线程
    iyaozhen
        49
    iyaozhen  
       3 天前   ❤️ 1
    恕我直言,就我多年面试经验。这个题太有歧义了,候选人很容易想复杂,面试很容易僵住。沟通能力是要考察,但不是这样考察,很容易错过一些候选人。
    如果别人用 replace 实现,又会更尴尬,我不知道接着问 replace 或者正则底层实现有什么意义

    我之前也有类似的一个题,把一个都是数字的字符串转成可能的 ip 形式。
    Input: s = "25525511135"
    Output: ["255.255.11.135","255.255.111.35"]
    但有一部分人(简历要求已经是 211+了)不理解题目意思(我已经贴了 leetcode 完整的描述),很容易想偏,后来换题目了。因为我认为好的题目不应该是看不懂就刷掉一部分,而是都看得懂,有简单暴力的解法,也有巧妙的解法,谁都能做,做的过程中能看出梯度差异
    poltao
        50
    poltao  
       3 天前   ❤️ 2
    所以说面试是比较看运气的,你看吧,结合评论区什么样的题目都能出现以及面试官们还沾沾自喜,啧啧啧
    keshawnvan
        51
    keshawnvan  
       2 天前
    @kinkin666 这个差不多算中等解法。达到这个水平已经比较优秀了,直接给过。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1247 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 23:52 · PVG 07:52 · LAX 16:52 · JFK 19:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.