一个有趣的 JavaScript 面试挑战
大家好!欢迎回到“代码评审”系列,这是 Dev.to 每周独家发布的一系列编程面试挑战和职业相关内容。我是伊丽莎白·格罗斯 (Elisabeth Gross),你可能因为我在Coderbyte的工作而认识我,Coderbyte 是一个致力于帮助各级开发人员获得下一份工程工作的网站。或者,你可能正在关注这个系列,为你的下一次重要面试做准备!
撰写本系列文章最让我开心的部分是,能够认识你们这个由充满干劲和热情的开发者组成的社区,你们都热衷于提升自己的编程技能。如果您想了解更多技巧和窍门以及一些开发者生活方式的内容,请在 Instagram 上关注我 @elisabethgross568。我会分享我在纽约最喜欢去的咖啡店、我最喜欢在编程时听的一些播放列表,以及其他许多有趣的内容!我迫不及待地想和你们进行更多交流。好了,闲话少叙——让我们开始讨论上周挑战的解决方案吧。
解决方案
这个解决方案利用了这样一个事实:所有字母重排的字母频率都相同,尽管顺序不同。我们可以用一个对象来存储每个字符串中的字母以及它们出现的频率。如果两个字符串的字母频率相同,那么我们就得到了一个字母重排的字母!代码如下:
function anagram(str1, str2) {
// replace all whitespace characters
const arr1 = str1.toLowerCase().replace(/\s+/g, '').split('')
const arr2 = str2.toLowerCase().replace(/\s+/g, '').split('')
const obj = {}
arr1.forEach(letter => {
if (!obj[letter]) obj[letter] = 0
obj[letter]++
})
arr2.forEach(letter => {
if (!obj[letter]) return false
else obj[letter]--
})
for (var letter in obj) {
if (obj[letter] !== 0) return false
}
return true
}
时间复杂度
此解决方案的时间复杂度为 ,O(n)
因为我们只需遍历每个字符串一次即可构建跟踪字母频率的对象。通常,使用对象来跟踪某些内容是降低算法时间复杂度的好方法。使用对象很便宜,因为获取和设置键和值的时间复杂度为O(1)
。
本周挑战
你是一名程序员,决定离开城市,前往森林,寻求片刻宁静。你通常从当地的一口井取水,但井水似乎已经干涸了。你决定收集雨水进行过滤,但你的收集装置并非扁平。编写一个算法,计算给定n
代表海拔图的非负整数,其中每个条形的宽度为1,你一次可以收集多少雨水。
例如:给定[0,3,0,1,0,0,0,1,0,2]
回报 12
其可视化形式如下:
享受!
我们的时事通讯📫
每次发布重大功能时,我们都会发布一小段功能揭秘,以便我们的社区能够第一时间获悉我们的新动态。请在此处提供您的电子邮件地址,我们会将您添加到“第一时间知晓”列表中 :)
Coderbyte 独家促销
此外,为了感谢我们优秀的 Dev.to 社区,我们想为读者们提供一项特别优惠。点击此秘密结账页面,即可享受订阅和一次性付款七折优惠。
鏂囩珷鏉ユ簮锛�https://dev.to/coderbyte/a-fun-javascript-interview-challenge-4mc7