首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hackerrank“哈希表:勒索说明”Javascript解决方案

Hackerrank“哈希表:勒索说明”Javascript解决方案
EN

Code Review用户
提问于 2017-06-14 09:12:20
回答 1查看 1.1K关注 0票数 3

这是原问题,这是我的解决方案:

代码语言:javascript
复制
function main() {
    var m_temp = readLine().split(' ');
    var m = parseInt(m_temp[0]);
    var n = parseInt(m_temp[1]);
    magazine = readLine().split(' ');
    ransom = readLine().split(' ');

    var freqs = {}
    for (var i = 0; i < m; i++){
      freqs[magazine[i]] = (freqs[magazine[i]] || 0) + 1;
    }

    var result = "Yes"
    for (var j = 0; j < n; j++){
      if (freqs[ransom[j]] && freqs[ransom[j]] > 0){
          freqs[ransom[j]] -= 1;
      } else {
          result = "No"
          break;
      }
    }

    console.log(result)
}

我想知道是否有比这更有效的解决方案?谢谢!我知道forEach可以用于代码简洁,但我只是使用for循环来获得额外的性能好处(https://coderwall.com/p/kvzbpa/don-t-use-array-foreach-use-for-instead)

EN

回答 1

Code Review用户

回答已采纳

发布于 2017-06-14 13:10:45

您的解决方案可能适用于有效的输入,但您并不是在检查无效的输入情况,例如当勒索信中包含的单词比杂志中的单词多时:

代码语言:javascript
复制
if(n > m):
    throw new Error("ransom can not be written from magazine");

您甚至可以进一步检查第一行是否与它假装的内容相对应:

代码语言:javascript
复制
if (magazine.length !== m) 
    throw new Error("Wrong words number in magazine");
if (ransom.length !== n) 
    throw new Error("Wrong words number in ransom");

您可以在一行中重构上述条件:

代码语言:javascript
复制
if(n > m || agazine.length !== m || ransom.length !== n):
    throw new Error("Invalid input");
票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

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

复制
相关文章

相似问题

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