Java 哈希表:勒索通知hackerrank

Java 哈希表:勒索通知hackerrank,java,Java,哈罗德是一名绑匪,他写了一张赎金便条,但现在他担心这会通过他的笔迹追溯到他。他找到了一本杂志,想知道他是否能从杂志上剪下整句话,并用它们来制作一份无法追踪的赎金记录副本。他便条中的文字区分大小写,他必须只使用杂志上的全部文字。他不能使用子字符串或连接来创建所需的单词 根据杂志上的文字和赎金单上的文字,如果他能准确地使用杂志上的全部文字复制赎金单,则打印“是”;否则,请打印“否” 例如,注释是“拂晓进攻”。该杂志只刊载“黎明进攻”。杂志上的字眼都对,但有一个案例不匹配。答案是 样本输入0 6.4

哈罗德是一名绑匪,他写了一张赎金便条,但现在他担心这会通过他的笔迹追溯到他。他找到了一本杂志,想知道他是否能从杂志上剪下整句话,并用它们来制作一份无法追踪的赎金记录副本。他便条中的文字区分大小写,他必须只使用杂志上的全部文字。他不能使用子字符串或连接来创建所需的单词

根据杂志上的文字和赎金单上的文字,如果他能准确地使用杂志上的全部文字复制赎金单,则打印“是”;否则,请打印“否”

例如,注释是“拂晓进攻”。该杂志只刊载“黎明进攻”。杂志上的字眼都对,但有一个案例不匹配。答案是

样本输入0

6.4 今天晚上给我一千 今天给一千块 样本输出0

对 样本输入1

6.5 二乘三不是四 二乘二等于四 样本输出1

没有

我的代码5/22测试用例失败:(

我不明白为什么5失败了

static void checkMagazine(String[] magazine, String[] note) {

    int flag = 1;
    Map<String, Integer> wordMap = new HashMap<>();
    for(String word: magazine) {
        if(!wordMap.containsKey(word)) {
            wordMap.put(word, 1);
        } else
            wordMap.put(word,wordMap.get(word)+1);
    }
    for(String word: note){
        if(!wordMap.containsKey(word)){
            flag = 0;
            break;
        } 
            else wordMap.remove(word, wordMap.get(word));       
    }

    if(flag == 0)
        System.out.println("No");
    else
      System.out.println("Yes");
}
静态无效检查库(字符串[]库,字符串[]注释){
int标志=1;
Map wordMap=newhashmap();
for(字串:杂志){
如果(!wordMap.containsKey(word)){
wordMap.put(word,1);
}否则
wordMap.put(word,wordMap.get(word)+1);
}
for(字符串:注释){
如果(!wordMap.containsKey(word)){
flag=0;
打破
} 
else wordMap.remove(word,wordMap.get(word));
}
如果(标志==0)
系统输出打印项次(“否”);
其他的
System.out.println(“是”);
}

这可能是因为在检索杂志时,您没有减少杂志中的单词数量,而是完全删除了该单词的所有计数。请尝试以下操作:

for(String word: note){
    if(!(wordMap.containsKey(word) && wordMap.get(word) > 0)){
        flag = 0;
        break;
    } 
    else wordMap.put(word, wordMap.get(word)-1);       
}

wordMap
是一个频率表,提供字数。 但是,对于便笺中的每个单词,必须减少字数,而不是完全删除该条目。只有当字数达到0时,才能删除该条目

另一个问题是区分大小写。根据需要,您可能需要将所有单词转换为小写


我认为,这种实现更简单

static boolean checkMagazine(String[] magazine, String[] note) {
    List<String> magazineCopy = new ArrayList<>(Arrays.asList(magazine));

    for (String word : note)
    {
        if (magazineCopy.contains(word)) {
            magazineCopy.remove(word);
            continue;
        }
        return false;
    }
    return true;
}
您正在从映射中删除该单词,而不是减少此类单词的数量,并且只有当该数量达到0时,才应从映射中删除该单词。

Python解决方案

def checkMagazine(magazine, ransom):
    magazine.sort()
    ransom.sort()
    for word in ransom:
        if word not in magazine:
            flag = False
            break
        else:
            magazine.remove(word)
        flag = True

    if (flag):
        print("Yes")
    else:
        print("No")

如果
note
中多次出现相同的单词,您可能无法正确处理这些情况。我想您没有看到,这些单词可能在注释中出现多次,然后杂志中必须有足够的重复。我想您没有看到我的实现-这些情况都存在。一个单词可以出现在许多tim列表中是的。哦,我明白了,对不起。通过排序和进行二进制搜索甚至可以加快速度。是的,你是对的。但是在我们需要对列表进行排序之前,但在排序之后,将能够比仅在常规的
包含
@Michel\T中更快地找到值。是的,无论m和n是什么,都是创建地图的线性时间,以及创建地图的线性时间给这张钞票打分。
static boolean checkMagazine(String[] magazine, String[] note) {
    List<String> magazineCopy = new ArrayList<>(Arrays.asList(magazine));

    for (String word : note)
    {
        if (magazineCopy.contains(word)) {
            magazineCopy.remove(word);
            continue;
        }
        return false;
    }
    return true;
}
else wordMap.remove(word, wordMap.get(word));
def checkMagazine(magazine, ransom):
    magazine.sort()
    ransom.sort()
    for word in ransom:
        if word not in magazine:
            flag = False
            break
        else:
            magazine.remove(word)
        flag = True

    if (flag):
        print("Yes")
    else:
        print("No")