首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >哈希表:勒索说明- Javascript中的Hacker等级

哈希表:勒索说明- Javascript中的Hacker等级
EN

Code Review用户
提问于 2018-07-21 14:14:19
回答 1查看 589关注 0票数 2

我正在准备一次面试,做黑客等级的准备问题,我想在这方面做得更好。这能得到一些反馈吗?如何改进我的代码?你是怎么解决这个问题的?

代码语言:javascript
复制
function getCount(array){
    let counts = {}
    for(let word of array){
        let count = counts[word]
        counts[word] = count ? counts[word] + 1: 1;
    }
    return counts
}
// Complete the checkMagazine function below.

function compareNoteMag(note,mag){
    let noteKeys = Object.keys(note)
    let string = 'Yes'
    for(let key of noteKeys){
        if(!mag[key]) string = 'No'
        if(mag[key] < note[key]){
            string = 'No'
        }
    }
     console.log(string)
}

function checkMagazine(magazine, note) {
    let magazineCount = getCount(magazine);
    let noteCount = getCount(note);
    compareNoteMag(noteCount,magazineCount)
};
EN

回答 1

Code Review用户

回答已采纳

发布于 2018-07-22 15:48:26

性能

在发布的代码中有几个性能问题:

  1. noteKeys上的循环即使在它知道一个单词丢失之后也会继续。应该停下来。
  2. 杂志上的字数图是不必要的内部储存。在一次采访中,一个可能要讨论的问题是:“如果杂志不适合你的记忆,你将如何改变你的实现?”思想的食粮。

程序组织

最好是一个函数做一件事。compareNoteMag做两件事:计算杂志中是否有足够的单词,并打印“是”或“否”。这应该是一个返回boolean的函数,它有一个适当的描述性名称。

安全

第二个if在这里应该是一个else if

if(!mag钥匙) string = 'No‘if(mag钥匙 < note钥匙){ string = 'No’}

这不仅效率低下(有时对第二个if进行不必要的评估),第二个if中的表达式有时是undefined和一个数字之间的比较,这可能会使人感到困惑并导致错误。

命名

其中一些名字可能更好:

  • getCount返回计数图(复数),因此我将重命名为getCounts (复数)。
  • getCount使用了一系列单词:words将是一个自然而直观的名称,而不是array
  • compareNoteMag计算打印的答案:answer将是一个自然而直观的名称,而不是string

技术

而不是这样:

让计数=计数单词计数单词=计数?计数单词+ 1: 1;

JavaScript中的一种常用技术:

代码语言:javascript
复制
counts[word] = (counts[word] || 0) + 1;

关注细节

这很小,但我注意到有些草率:

  • 分号大多被省略,但并不总是。
  • function checkMagazine(...) { ... };末尾,分号是不必要的
  • 注释// Complete the checkMagazine function below.不应该在那里
  • 常见的惯例是在for(...){if(...){中的圆括号周围放置空格。
票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/199989

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档