一个有趣的JavaScript面试挑战
嘿大家欢迎回到Code评测,这是每周在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)
。
本周的挑战
您是一位已决定离开城市进入森林以获得一些急需的和平与宁静的程序员。通常,您从当地的水井取水,但似乎已经干dry了。您已决定收集雨水进行过滤,但是收集设备不是平坦的。编写算法以确定给定一次可以收集多少雨 n
代表海拔图的非负整数,其中每个条的宽度为1。
示例:给定 [0,3,0,1,0,0,0,1,0,2]
返回12
可以如下所示:
请享用
我们的通讯?
每次发布较大的内容时,我们都会发送一个小功能的摘要片段,因此,我们的社区是第一个知道何时发布新内容的人。在这里给我们您的电子邮件,我们会将您添加到我们的“第一个知道”列表中:)
独家Coderbyte促销
并且,感谢您的敬畏Dev.to社区,我们很乐意向读者推广特别促销。前往此秘密结帐页面,可享受30%的订阅折扣和一次性付款。