Java 哈希表:勒索通知hackerrank
哈罗德是一名绑匪,他写了一张赎金便条,但现在他担心这会通过他的笔迹追溯到他。他找到了一本杂志,想知道他是否能从杂志上剪下整句话,并用它们来制作一份无法追踪的赎金记录副本。他便条中的文字区分大小写,他必须只使用杂志上的全部文字。他不能使用子字符串或连接来创建所需的单词 根据杂志上的文字和赎金单上的文字,如果他能准确地使用杂志上的全部文字复制赎金单,则打印“是”;否则,请打印“否” 例如,注释是“拂晓进攻”。该杂志只刊载“黎明进攻”。杂志上的字眼都对,但有一个案例不匹配。答案是 样本输入0 6.4 今天晚上给我一千 今天给一千块 样本输出0 对 样本输入1 6.5 二乘三不是四 二乘二等于四 样本输出1 没有 我的代码5/22测试用例失败:( 我不明白为什么5失败了Java 哈希表:勒索通知hackerrank,java,Java,哈罗德是一名绑匪,他写了一张赎金便条,但现在他担心这会通过他的笔迹追溯到他。他找到了一本杂志,想知道他是否能从杂志上剪下整句话,并用它们来制作一份无法追踪的赎金记录副本。他便条中的文字区分大小写,他必须只使用杂志上的全部文字。他不能使用子字符串或连接来创建所需的单词 根据杂志上的文字和赎金单上的文字,如果他能准确地使用杂志上的全部文字复制赎金单,则打印“是”;否则,请打印“否” 例如,注释是“拂晓进攻”。该杂志只刊载“黎明进攻”。杂志上的字眼都对,但有一个案例不匹配。答案是 样本输入0 6.4
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")