最近看到一个有点刺激的帖子,讲的是一个大专学历的小伙伴,凭着“某省211”学历造假顺利拿到了字节跳动(抖音)的Offer。为了提高通过率,他没有填自己的真实学历,而是写了个211的学历,还把在外包公司的经历包装成了甲方工作经验。
面试顺利通过,甚至还没碰到背调环节,感觉自己捡到了一个大便宜。然而,等到后续收到背调通知时,才意识到问题来了——自己写的学历和工作经历可能会被查出来,他该怎么办呢?
最后他决定直接拒绝背调,拿着字节的Offer找到了另一家中型公司,虽然薪资稍微低一点,但至少没有那么大的工作压力。
从这件事来看,虽然学历和背景对很多人来说非常重要,但对一些公司来说,实际能力才是关键。可是,造假这种事,还是有风险的,尤其在今天的求职市场,很多公司都开始严格审查求职者的背景和资历,背调环节也越来越常见。
这让我想到,作为一名开发工程师,最重要的其实是技术实力和项目经验。比如,在我们这个行业,很多公司更看重的是你解决问题的能力,而非单纯的学历和工作经历。
你是否能通过代码解决实际问题,是否能在技术面试中展示出自己的能力,才是最终决定你是否能拿到Offer的关键。
今日算法题
说到这,接下来我们不妨聊聊面试中经常出现的一个算法题:字母异位词分组。在编程中,有时我们需要将一组字符串按照字母异位词分组。
字母异位词是指两个字符串包含相同的字母,只是这些字母的顺序可能不同。例如,"eat" 和 "tea" 就是字母异位词,因为它们包含的字母完全相同,只是顺序不同。
为了将一组字符串分组为字母异位词,我们可以使用排序的方法。具体来说,对于每一个字符串,我们对其字母进行排序,得到一个标准化的表示形式。对于所有的字母异位词,排序后的结果将会是相同的,因此,我们可以利用这个特性来将它们归为同一组。
我们可以使用一个对象(在 JavaScript 中是一个字典或哈希表)来存储这些分组。每个分组的键是排序后的字符串,值则是一个包含所有字母异位词的数组。
当我们遍历所有的字符串时,只需要对每个字符串进行排序,并将其加入到对应键的值中,最后输出所有分组即可。
在 JavaScript 中,我们可以这样实现:
function groupAnagrams(strs) {
const anagrams = {}; // 用于存储字母异位词分组的对象
// 遍历输入的每个字符串
for (let str of strs) {
// 将字符串的字母排序,得到一个标准化的键
const sortedStr = str.split('').sort().join('');
// 如果对象中没有这个排序后的键,则初始化一个空数组
if (!anagrams[sortedStr]) {
anagrams[sortedStr] = [];
}
// 将当前字符串加入到对应的字母异位词组中
anagrams[sortedStr].push(str);
}
// 返回所有的字母异位词组
return Object.values(anagrams);
}
// 测试
const strs = ["eat", "tea", "tan", "ate", "nat", "bat"];
const result = groupAnagrams(strs);
console.log(result);
在这段代码中,首先我们创建了一个空对象anagrams
来存储字母异位词的分组。
接着,我们遍历输入的每个字符串,对于每个字符串,我们通过split('')
方法将它拆分成字符数组,然后用sort()
方法对数组进行排序,最后用join('')
方法将字符数组重新拼接成一个字符串。这个排序后的字符串就是字母异位词的标准化表示形式。
接着,我们检查对象中是否已经存在这个排序后的字符串作为键。如果不存在,就初始化一个空数组。如果已存在,则直接将当前字符串添加到对应的数组中。
最后,使用Object.values(anagrams)
返回字典中的所有字母异位词分组。
这段代码的时间复杂度是 O(N * K log K),其中 N 是字符串的数量,K 是每个字符串的长度。对于每个字符串,我们都需要对它进行排序,排序的时间复杂度是 O(K log K),因此整体的时间复杂度是 O(N * K log K)。
这段代码能够有效地将一组字符串分组为字母异位词,并且易于理解。可以应用于许多实际场景中,例如在处理单词游戏时,或者在进行数据去重时,都是非常实用的技术。
目前,对编程、职场感兴趣的同学,大家可以联系我微信:golang404,拉你进入“程序员交流群”。
虎哥私藏精品 热门推荐 虎哥作为一名老码农,整理了全网最全《前端资料合集》。