Hackerrank:哈希表 - 赎金票据

时间:2016-10-05 22:05:44

标签: javascript algorithm hashtable

尝试使用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");
}

非常感谢!!

3 个答案:

答案 0 :(得分:2)

这是我已经完成的版本,它还会检查以确保您不会多次使用该字词,这不在规范中,但我也是没有多大意义可以使用一个单词,就像从文件中删除单词一样。

还要对参数进行小规模的检查,以确保计数正确。

&#13;
&#13;
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();
&#13;
&#13;
&#13;

答案 1 :(得分:0)

以下是您的代码的以下问题:

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

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

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

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

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

希望它有所帮助!!!

答案 2 :(得分:0)

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");
            }
        }