【问题标题】:Hackerrank: Hash tables- Ransom noteHackerrank:哈希表-赎金记录
【发布时间】:2017-02-14 12:24:32
【问题描述】:

尝试使用 Javascript 解决黑客等级的问题: https://www.hackerrank.com/challenges/ctci-ransom-note

希望得到一些帮助,因为我没有通过所有测试用例,我的代码是:

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 hashTable = {};
    var counter = 0;
    for (var i = 0; i < ransom.length; i++) {
        hashTable[i] = ransom[i];
    }
    for (keys in hashTable) {
        if (magazine.hasOwnProperty(keys)) {
            counter +=1;
        } else { 
            counter -=1;
        }
    }
    console.log(counter >= n ? "Yes" : "No");
}

非常感谢!!

【问题讨论】:

  • 了解如何测试失败会很有用。除非你想要随机修复,可能会也可能不会。
  • 如果问题是这段代码正确,答案是否定的。
  • 其中一个测试用例具有以下输入:17 15 avtq ekpvq z rdvzf m zu bof pfkzl ekpvq pfkzl bof zu ekpvq ekpvq ekpvq ekpvq z mz z avtq zu bof pfkzl pfkzl pfkzl rdvzf rdv rdvzf avtq 预期的输出是“否”,我已经测试过,我也得到了“否”,但它说错了。
  • @Keith 如果您没有有价值的意见要添加为什么评论?
  • @LeChiffre 我在澄清他的问题..

标签: javascript algorithm hashtable


【解决方案1】:

这是我做过的一个版本,它也在检查以确保你不会多次使用这个词,它不在规范中,但我也没有意义能够使用更多的词不止一次,就像从纸上剪下单词一样。

还要对参数进行一次小的健全性检查,以确保计数正确。

var lines = [
  "6 4",
  "give me one grand today night",
  "give one grand today"
];

function readLine() {
  return lines.shift();
}


function main() {
    var m_temp = readLine().split(' ');
    var m = parseInt(m_temp[0]);
    var n = parseInt(m_temp[1]);
    var i;
    magazine = readLine().split(' ');
    ransom = readLine().split(' ');
    //sanity check..
    if (magazine.length !== m) 
      throw new Error('Magazine count wrong');
    if (ransom.length !== n) 
      throw new Error('Ransom count wrong');
    //build a hash of all the words in magazine
    var hashTable = {};
    for(i = 0; i < magazine.length; i++){
        var word = magazine[i];
        if (!hashTable[word]) hashTable[word] = 1;
        else hashTable[word] ++;
        //keep a count, as a word surely can only be used once.
    }
    //now loop ransom and see if all are in magazine.
    var counter = 0;
    for(i = 0; i < ransom.length; i++) {
        if (hashTable[ransom[i]]){
          counter += 1;
          hashTable[ransom[i]] --;  //word has now been used.
        }
    }
    console.log(counter >= n? "Yes":"No");
}

main();

【讨论】:

  • console.log(counter &gt;= n? "Yes":"No"); 我不认为 counter &gt;= n 有机会。请改成counter == n
  • @User_Targaryen 你觉得这样做有什么好处?.. 另外,如果我要进行相等比较,我自然会使用严格的变体“===”。虽然性能在这里不是问题,但值得指出的是 >= 比 == 快,如果比 === 稍快,我认为这将取决于 CPU 能够短路 >= 逻辑,如果数字在哪里改为浮点数,相等性检查也可能有奇怪的问题。因此,IMO,如果可以使用 >= 作为 ===,我会选择 >=..
  • @User_Targaryen 确实,编码风格是个人的,我个人认为 >= 看起来更好,更合乎逻辑,而且我也认为它也不太可能犯错误 = for ==。除此之外,这是 OP 所拥有的,我试图尽可能少地改变 :)
  • 全部接受!!根据您的代码,counter 永远不会大于n。所以它绝对不是合乎逻辑的..
  • @User_Targaryen 这取决于你的选择,我可以看到你来自哪里,但我喜欢 >=,
【解决方案2】:

您的代码存在以下问题:

  • 你没有逻辑来计算magazine中某个单词的出现次数,这是一个巨大的缺陷。

    考虑magazine : give thisransom : give give 的示例。您的代码将返回Yes,而答案是No,因为magazine 中只有一个give

  • 我不认为在这里使用hasOwnProperty 是合适的。您只想知道magazine 中是否存在某个单词。您可以使用magazine.includes(hashTable[keys]) 代替magazine.hasOwnProperty(keys)

  • 最后,你应该hash杂志的词而不是赎金的话,并记录每个杂志词的出现次数。

尝试纠正这些问题,您的代码肯定会运行。你可以阅读@Keith 的代码。

希望对你有帮助!!!

【讨论】:

    【解决方案3】:
    try to use below code to check for correctness
    
    static void checkMagazine(string[] magazine, string[] note)
            {
                Boolean isCorrect = true;
                for (int i = 0; i < note.Length; i++)
                {
    
                    if (magazine.Contains(note[i]))
                    {
                        if (magazine.Count(f => f == note[i]) != note.Count(f => f == note[i]))
                        {
                            isCorrect = false;
                            break;
                        }
                    }
                    else
                    {
                        isCorrect = false;
                        break;
                    }
    
                }
                if (isCorrect)
                {
                    Console.WriteLine("Yes");
                }
                else
                {
                    Console.WriteLine("No");
                }
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-21
      • 1970-01-01
      • 1970-01-01
      • 2018-05-27
      • 1970-01-01
      相关资源
      最近更新 更多