尝试使用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");
}
非常感谢!!
答案 0 :(得分:2)
这是我已经完成的版本,它还会检查以确保您不会多次使用该字词,这不在规范中,但我也是没有多大意义可以使用一个单词,就像从文件中删除单词一样。
还要对参数进行小规模的检查,以确保计数正确。
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;
答案 1 :(得分:0)
以下是您的代码的以下问题:
你没有逻辑来计算magazine
中一个词的出现次数,这是一个巨大的缺陷。
考虑magazine
:give this
和ransom
:give 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");
}
}