Chewy 整体的感觉来看应该是对 OA 的结果比较看重的公司。 如果你的 OA 没有运行结果,哪怕你是再说得天花乱坠,思路再好,他们可能都会以你的 OA 程序运行没有运行结果而告诉你的水平达不到他们公司的预期 Mark 而拒绝你进行下一步。 本轮 Chewy 的面试时间是 1 个小时,其实主要是 2 个部分。 第一部分 第一部分主要就是你的项目经验了,你在你的公司是干什么的,你在项目中有什么问题啥的。 其实这个我都认为全靠掰扯,因为所有的公司在项目上多多少少都会有点问题,完全没有问题的应该非常少,可能甚至说就是另类。 比如说 CI/CD 的问题,对中小信息系统,比如说数据 Lock 表的问题,滥用消息服务器的问题。 如果你真是大学才毕业,那这些问题可能你真的就只是听说过,并没有真正遇到过,所以这个地方不是那么好掰扯。 如果你真有过什么项目经验,这个就太好说了,随便拿几个自己做过的项目掰扯下都能说好久。 比如说,我们项目的 CI/CD 集成缓慢导致 bug 给重复覆盖的情况比比皆是。 在这里需要注意下,参加你面试的人可能会对你的说过的名词扣一下,会根据你的表述问一些具体深入的问题。 这个时候你需要小心点,如果不是自己真正做过的,如果不是自己有经验的,只是你自己听过的一些名词的话,别乱说。 因为你在后面会因为你说的这些名词解释不清。 代码 这个地方就是有意思的地方了。 我一直认为的是思路远远比结果更重要,对我自己的组员我自己的要求也是你不仅仅要有自己的思路,同时你的思路也应该能够被其他人理解。 更重要的是简单,也许有时候复杂的问题只需要简单的解决办法,可能你并不需要把自己绕晕的数据结构。 偷懒,我就不把题目全部写下来了。 请参考上面的题目,其实题目的难度不大的,多是字符串处理方面。 要解决这个题目,需要的知识: 据规范化处理,只保留字符。 数据结构 HashMap, List 数据结构遍历 字符串处理 数据输出 从上面来看是不是内容还是比较多的。 我的思路是:首先完成规范化处理,然后把规范化处理后的结果按照我们希望的格式放入到数据结构中,最后对放入的数据结构进行处理后输出。 删除不需要的字符 在这个地方,我们需要对不需要的字符进行删除。 这个地方需要用到正则表达式。什么?你不会用? 哈哈,这就对了,正常人不 Google 下都不会用。 好在和我面试的人给了正则表达式给我,删除不需要的字符,保留空格。 同时需要注意的是,上面的所有输出都是小写字符,因此我们还需要对大写小写字符进行转换,这个可以在构建 Map 的时候完成,省得这里还多一次循环。 实际上的代码如下: String s1 = "Question, what kind of bear is best?"; String s2 = "That's is a ridiculous question!"; String s3 = "False."; String s4 = "Black bear is the best bear."; List<String> inputStr = new ArrayList<>(); inputStr.add(RegExUtils.replaceAll(s1, "[^a-zA-Z\\s]", "").toLowerCase()); inputStr.add(RegExUtils.replaceAll(s2, "[^a-zA-Z\\s]", "").toLowerCase()); inputStr.add(RegExUtils.replaceAll(s3, "[^a-zA-Z\\s]", "").toLowerCase()); inputStr.add(RegExUtils.replaceAll(s4, "[^a-zA-Z\\s]", "").toLowerCase()); 程序输出如下: 构建数据结构 在数据结构构建上面,我们应该需要的是使用 Map 了。 因为我们需要首先知道有多少个字符我们要输出,对吧。 这个就是 Map 的 Key,那么 Map 的 Value 是什么呢? 根据输出来看,我们用 bear 这个单词出现了 3 次,分别在第一句话和第 4 句话里面。 那我们这个 map 怎么用? 被带沟里去了。 我就是在这里被带沟里面去了,我其实最开始想使用的是最简单的数据结构来做的,Map 的 Key 是 String ,Value 是 List,在 List 里面是字符串,这样我就有足够的数据知道我自己要干什么了。 面试的人在这里提醒了下是不是可以用 2 个 Map。 当然这里可以用 2 个 Map 的。 第一个 Map 的 Key 还是字符串,但是第二个 Map 的是 key 是整数,Value 也是整数,第一个整数是当前字符串在那个句子里面,第二个整数是在句子中的位置。 这种数据定义其实也非常明确的。 问题不在数据定义这里,问题在你最后的数据构造,因为你有了 Map 里面还有 Map 在获取值的时候容易把自己绕晕了。 结果我在这里花了 30 多分钟调试错误,后来我放弃了,我直接用我自己的第一套方案。 代码如下: for (int i = 0; i < inputStr.size(); i++) { String words = inputStr.get(i); List<String> wordsList = List.of(StringUtils.split(inputStr.get(i))); for (int j = 0; j < wordsList.size(); j++) { String word = wordsList.get(j); List<String> inStr = new ArrayList<>(); if (wordsMap.get(word) != null) { inStr = wordsMap.get(word); } inStr.add((i + 1) + "#" + (j + 1)); wordsMap.put(word, inStr); } } 程序输出如下: 参加我面试的人在这里已经疯了。 他说从来没有见过这样输出的。 我说,这个很正常呀,我构建一个 List,上面用数字表示当前这个词所在句子的位置和在句子中的单词位置。 因为位置都是标记,所以通常都为整数,这个地方是不会那么容易抛出空对象异常的,同时上面的文本还表意,很容易定位问题。 格式化输出 这个地方我已经没有时间做了。 因为开始折腾用 2 个 HashMap 已经搞了老久了,其实到这里已经超过时间了。 可能面试的人也想帮我吧,他说你有时间吗? 如果你有时间的话我们可以继续的。 因为,可能他知道没有运行结果,公司是不会进行下一步的,所以他问了 2 次我有时间吗?他可以一起。 我自己可能觉得到这里其实输出也非常容易了,后期的格式化输出大概率情况就是排序和遍历,没有太多的实际价值,同时还要遍历 Map,我就在这里简单说了下思路。…