先说我的题:
返回值 response 是一个 map ,里面的结构类似于 {"key1":100, "key2":"100", "key3":[100, "100], "key4":{……}}
手写一个函数,输入是 response ,输出要求把其中的数字 100 替换为数字 200 。
这题用了十年了,面下来能写清楚这题的大概只有一半不到?
![]() |
1
kandaakihito 4 天前
针对你这个面试题,我想到一个歪门邪道:把对象转换成 json ,然后把“100”批量替换成“200”,再转回来(
|
2
tamwingjet666 4 天前
我也是想到批量换,所以标准答案是啥
|
![]() |
3
learnshare 4 天前 ![]() "key3":[100, "100], // invalid value
|
4
gefangshuai 4 天前
为什么传入 map 的时候没有直接传入 200 ?现在这样修改 map 岂不是垃圾代码?
|
![]() |
5
leokun 4 天前
把 map 包装成 A 结构,在取 A 结构的属性时候判断下
|
6
kehuduanbuxing OP @learnshare 😂
|
7
kehuduanbuxing OP ![]() @gefangshuai 可以想象一个场景,是涉黄涉恐关键词替换为***
|
8
rafa 4 天前
不可以直接转字符串,然后正则修改么?
|
![]() |
9
corcre 4 天前 ![]() js 的话写一个 dfs 用 Object.keys 遍历然后针对值/数组作处理, 如果是对象就继续丢 dfs?
|
10
kehuduanbuxing OP @tamwingjet666 简单点就递归。复杂点就正则,顺便考考正则的实现原理
|
![]() |
11
musi 4 天前 ![]() 我选择转字符串然后 replaceAll
我觉得自己写的代码优化应该赶不上 v8 |
![]() |
12
15855pm 4 天前 ![]() 不讲武德解法:str(response).replace('100', '200')
|
13
kehuduanbuxing OP @15855pm 这样会替换到字符串 100 ,是没有考虑边界情况的解法。之后就开始问你 replace 方法的内部是如何实现的了👀
|
![]() |
14
DOLLOR 4 天前
我会把你的题目扩展一下:
如果有新的需求,要把数字 200 替换为字符串"300",再过几天,又要把 0 和 1 替换为 false 和 true…… 这样肯定会没完没了,不可能每个替换规则都重写一个函数。 所以请设计一个更通用的函数,输入是 response 和一个 callback: (key, value, object)=>any ,由调用者在 callback 里决定替换规则。 |
15
felilong123 4 天前
@DOLLOR 哈哈哈,非常符合产品天天需求改来改去的真实场景
|
![]() |
16
gaoryrt 4 天前
1.正则验证小于 256 的自然数
|
![]() |
17
lesismal 4 天前 ![]() 隔壁 /t/1121006 题目没什么歧义、简单算法也算实用常用。
OP 这个题,恕我冒昧,这是近期看到的最垃圾的面试题,竟然还用了十年。 BTW ,近期一共看了两道面试题,隔壁和这里。。。 最基本的,没有标明语言,不同语言静态动态强弱类型对 map 的处理可是不大相同的,是否只是处理数值类型的 100 ,不同语言对类型的处理也是不大相同的,搞不好还要反射 > 输出要求把其中的数字 100 替换为数字 200 这句,不算严谨,字符串里的数字 100 算不算?反正我是不能确定出题者目的 如果是说 数值类型的 100 ,就不会太歧义了 |
18
kehuduanbuxing OP @lesismal 语言和语言特性在我这里大概没这么重要,考察的是计算机基础。需求不明确可以沟通,也看看沟通能力。上来只会喷的,大概是做题做的思维固化了。
|
19
bbao 4 天前
[这题用了十年了,面下来能写清楚这题的大概只有一半不到?]
说明题不好 除了遍历 或 递归遍历 + 反射判断类型,比较 value 后替换罢了,没其他好办法。 想到了前几天一个「格式化时间输出的面试题」给的一个答案: if value == 100 { value = 200 哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈 } 典型的场景:客户端 复杂无规则 payload JSON 请求体 + 客户端 payload 签名;服务器针对 payload 验签比较。 |
![]() |
20
tpeng9240 4 天前
这不就是各种类型判断,然后更新值,递归调用
|
![]() |
21
LLLeo 4 天前
先解析转成对象,然后字符串替换处理
|
22
pvnk1u 4 天前
这题有任何难度么,甚至还不如今天热搜贴那个计算时分秒的题
|
![]() |
23
woodfizky 4 天前
题目不够清晰,很多限定条件没有说明白。
比如,你这个 map ,没有限定是什么语言的 map ,也没有限定范围到底是只是 key 还是 value 。 那假如我用 python 的 dict 去代入,key 也同样可以是 int 类型的。 如果同时存在{100: 100, 200: 200},那替换完 key 重复直接就报错或者覆盖了。 |
![]() |
24
kinkin666 4 天前
简单点吧,解析了再 BFS ,这样不会爆栈
直接从字符串搞嘴巴讲讲可以,写有点麻烦 |
![]() |
25
gaoryrt 4 天前
@kehuduanbuxing #13 JSON.stringify(response).replace(/:100,/g, ':200,')
|
![]() |
26
lesismal 4 天前 ![]() > 语言和语言特性在我这里大概没这么重要,考察的是计算机基础。
如果是不需要编码的题,你这样说没啥问题,说思路就行了。但你这个题目是“手写一个函数”,编码了,用什么语言本身就是很大问题了,比如用 c ?。。。 > 需求不明确可以沟通,也看看沟通能力。上来只会喷的,大概是做题做的思维固化了。 看你的题面,这种多是笔试题。即使面试题,也可以,而且别人也没说不沟通啊。 但是这种简单问题,还要这么歧义,我只能认为是被我上一层回复后强行挽尊找的理由罢了。 更何况,这是论坛,你发个这种题目出来指望大伙楼下挨个继续追问题目,浪费大家时间呢么?。。 BTW ,我已经很多年没做过题了,我也从来不出这种题目去浪费别人时间。 年轻时候遇到过很多笔试题面试题题目本身就 sb 的,我也以为是故意考察沟通能力,所以也都沟通过,沟通之后发现,绝大多数这种题目吧,就是出题人自己拎不清。甚至一些语言的语法题,还得面试现场我教他。 更逗比的一些中小公司,自己工程里遇到的问题搞不定,拿来当面试题,我曾经就遇到过这种、然后面试时候解决方案优化方案一顿输出,给他们讲了一个多小时,面试官做笔记很细致。。。虽然这种我也不会去,但是技术交流也无所谓被他们白嫖,何况他们态度还恭敬的。。。 > 上来只会喷的 上一楼我只是比较平和指出你的题目的问题,我自己并不觉得是喷,为了避免让 OP 以为是喷,所以我用了“恕我冒昧”。 OP 也不必太敏感,上来就否定我指出的实际问题。 至于思维固化,这种题目用十年,是不是也该反思下到底是谁固化。 |
![]() |
27
RadishWind 4 天前
取 ` :\s+100[,\]\}\s]`这样的来做替换? (不管是手写还是正则)
|
29
tenzinjamyangzhs 4 天前 via Android
分享一下我的思路,kotlin ,遍历这个 map ,得到所有 second 为数字的 index ,记录成一个 indexlist ,再把所有是数字的 second 取出组成一个 numberlist ,再遍历这个 numberlist ,把每个元素都转成 string ,用 string.contains 获取所有包含 100 的元素的 index ,组成 100indexlist ,剩下的就是把对应 string 里的 100 换成 200 再转成数字,再根据 index 位置替换原 map 的相应内容最后返回。
|
30
chen0520 4 天前 ![]() 正则替换秒了
|
![]() |
31
JerryCanDo 4 天前
JSON.stringify(Object.fromEntries(response)).replace(/100/g, 200)
|
![]() |
32
Guidoo 4 天前
我之前面试外包,扁平数据转 Tree 函数,面了大概有 40-50 人吧,没有一个人能写出来的
|
![]() |
33
wyntalgeer 4 天前
@kehuduanbuxing #7 所以关键词在拼 json 的适合为什么不替换成***?
|
![]() |
34
pkoukk 4 天前
|
35
iOCZS 4 天前
其实吧,转 JSON ,直接逆序扫描字符串,原地替换也能实现。
|
![]() |
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} // 不用替换 }) } ``` |
![]() |
37
lidong1041 4 天前
@15855pm 这样好像不太行,1000 会被替换为 2000 ,2100 会替换为 2200 ,
|
![]() |
38
guanzhangzhang 4 天前
```
echo '{"key1":100, "key2":"100", "key3":[100, "100], "key4":{……}}' | sed -r 's#([:\[])100(,*)#\1200\2#g' ``` |
![]() |
39
qcbf111 4 天前
c# 说说解决办法。
1.需要在当前方法栈分配一个小型字典。 2.如何在字典遍历期间删除其中某些元素,除了再用一个临时结构保存还有哪些。 3.在一个正方形区域内有一百万个随机分布位置的单位,如何标记另一个小正方形圈中了的单位,如果是小圆形,小不规则四边形又如何找出范围内单位。 |
![]() |
40
main1234 4 天前
这题的意义在哪里?正确的解法可以分享下嘛
|
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; } }) } ``` |
![]() |
42
panbeta 4 天前
这个题目挺好,贴近日常工作,也能考察面试者对边界条件的考察。
首先这个 Map 是非单一对象的,里面包含 Integer String Map Array 。 题目是替换所有的 100 -> 200, 其实我们只需要处理 String 和 Integer 类型的数据就可以了。遇到 Map 和 Array 的话递归调用即可。 假设只替换 "100" -> "200",不考虑 "100100100" -> "200200200" 这种情况。 差不多一个递归函数 遍历 Map 的 AllKeys ,if 判断 Value 类型,然后 replace 就行。 |
43
fenghoer 3 天前
100 有数字也有字符串, 替换时还要排除 "100"
|
![]() |
44
edisonwong 3 天前
我想着尝试用一条正则直接解决:同时排除 \".*100.*\" 字符串的情况,但想了想....真写出来,后人也难以维护或者写一大段注释说明这条正则含义,还不是按上面说的哈哈哈
|
45
keshawnvan 3 天前
// 1 、编程:假设有一个 A 站点,每次登陆的时候都会记录用户的登陆信息日志(假设存储在数据库中),
// 对象类型是 User ,有 3 个字段:userId, userName, loginTime // 需求:统计最近 10 天(每天约 100 亿条日志) // 登陆最频繁的 10 个用户,并输出这 10 个用户各登陆多少次 // 要求:a. 不可直接使用 SQL 统计,请使用 JAVA 代码编写 // b. 功能完备,逻辑正确 |
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) |
47
htxy1985 3 天前
主贴不是说一人一道题吗,我来收题的,怎么全是解题的
|
![]() |
48
kinkin666 3 天前
@keshawnvan 主要是要防止内存炸了,以下是思路,叫豆包写能写的差不多
为第一天建立一个顺序存储文件里面存定长记录,格式为 %40s-%020d ( userId-次数) 扫两遍,第一遍把当天所有的用户名找出来,形成记录( userId-0 ) 然后调用外排序(按 userId ,不让用就写归并排序) 第二遍扫表,因为记录定长,可以二分查找方便地定位并累加次数 循环剩下天数,迭代处理,然后归并替代上一天的文件,相当于最多只会同时存在两个记录文件,一个归并文件 至此,形成了( userId-次数)文件,然后就是扫一遍用堆 topK 。 可以不按天来,按 100w 条记录这样形成一个文件,文件大小会更均匀 这个思路也可以多线程 |
![]() |
49
iyaozhen 3 天前 ![]() 恕我直言,就我多年面试经验。这个题太有歧义了,候选人很容易想复杂,面试很容易僵住。沟通能力是要考察,但不是这样考察,很容易错过一些候选人。
如果别人用 replace 实现,又会更尴尬,我不知道接着问 replace 或者正则底层实现有什么意义 我之前也有类似的一个题,把一个都是数字的字符串转成可能的 ip 形式。 Input: s = "25525511135" Output: ["255.255.11.135","255.255.111.35"] 但有一部分人(简历要求已经是 211+了)不理解题目意思(我已经贴了 leetcode 完整的描述),很容易想偏,后来换题目了。因为我认为好的题目不应该是看不懂就刷掉一部分,而是都看得懂,有简单暴力的解法,也有巧妙的解法,谁都能做,做的过程中能看出梯度差异 |
50
poltao 3 天前 ![]() 所以说面试是比较看运气的,你看吧,结合评论区什么样的题目都能出现以及面试官们还沾沾自喜,啧啧啧
|
51
keshawnvan 2 天前
@kinkin666 这个差不多算中等解法。达到这个水平已经比较优秀了,直接给过。
|