哈希 Table 未提供所需的输出
The Hash Table does not gives the desired output
我尝试用一个字符串数组的内容填充哈希 Table,然后匹配第二个数组的内容,如果它全部包含在第一个数组中。
例如
今天晚上给我一首盛大的曲子 - String A
今天给一个盛大的 - 字符串 B
我的程序应该输出 Yes,因为字符串 B 的所有内容都包含在 A 中。
详细问题在这里:- https://www.hackerrank.com/challenges/ctci-ransom-note/problem
这是我的 Java 代码:-
import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;
public class Solution {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int m = in.nextInt();
int n = in.nextInt();
String magazine[] = new String[m];
for(int magazine_i=0; magazine_i < m; magazine_i++){
magazine[magazine_i] = in.next();
}
String ransom[] = new String[n];
for(int ransom_i=0; ransom_i < n; ransom_i++){
ransom[ransom_i] = in.next();
}
Hashtable<Integer,String> hm = new Hashtable<Integer,String>();
for(int magazine_i=0; magazine_i < m; magazine_i++){
hm.put(1,magazine[magazine_i]);
//System.out.println(magazine[magazine_i]);
}
boolean isavailable = false;
for(int ransom_i=0; ransom_i < n; ransom_i++){
isavailable = hm.containsValue(ransom[ransom_i]);
//System.out.println(ransom[ransom_i]+" "+isavailable);
if(isavailable==flase)
{System.out.println("No"); break;}
}
if(isavailable==true)
System.out.println("Yes");
}
}
相反,它给出了 False,我认为问题是散列 table 无法匹配数组的内容及其值。
你的 Hashtable
只包含一个键值对,因为你初始化它的方式:
hm.put(1,magazine[magazine_i]);
先尝试改正
顺便说一句,你的做法是错误的。
要生成 ransom
,您必须确保 ransom
中的所有单词都包含在 magazine
中,并且 magazine
中该单词的计数应该大于或等于 ransom
.
中该词的相应计数
也就是说,如果ransom
包含4个词'today',那么在magazine
中,你必须保证至少有4个词'today'。
因此,您应该这样处理问题:
来自 magazine
,为 magazine
构建字数统计图:HashMap<String, Integer> magazineWordCount
。
来自 ransom
,为 ransom
构建字数统计图:HashMap<String, Integer> ransomWordCount
循环 ransom
键(通过 ransomWordCount.keySet()
),检查
magazineWordCount.contains(word) && magazineWordCount.get(word) >= ransomWordCount.get(word)
您可以通过这样做来简化代码
- 去掉输入大小的提示
快速失败
Scanner in = new Scanner(System.in);
System.out.println("Enter sentence 1");
String s1 = in.nextLine();
System.out.println("Enter sentence 2");
String s2 = in.nextLine();
List<String> s1List = Arrays.asList(s1.split(" "));
for (String w : s2.split(" ")) {
System.out.println("loooking for " + w);
if (s1List.contains(w) == false) {
System.out.println("Failed to find");
return;
}
}
System.out.println("yes");
编辑
如果你想使用哈希表,那么你可以像这样填写它
String [] arr = s1.split(" ");
Hashtable <Integer, String> s1ht = new Hashtable<Integer, String>();
for (int i = 0; i < arr.length; i++) {
s1ht.put(i, arr[i]);
}
其他代码相同(只需要更改变量名)
我尝试用一个字符串数组的内容填充哈希 Table,然后匹配第二个数组的内容,如果它全部包含在第一个数组中。
例如
今天晚上给我一首盛大的曲子 - String A
今天给一个盛大的 - 字符串 B
我的程序应该输出 Yes,因为字符串 B 的所有内容都包含在 A 中。
详细问题在这里:- https://www.hackerrank.com/challenges/ctci-ransom-note/problem
这是我的 Java 代码:-
import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;
public class Solution {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int m = in.nextInt();
int n = in.nextInt();
String magazine[] = new String[m];
for(int magazine_i=0; magazine_i < m; magazine_i++){
magazine[magazine_i] = in.next();
}
String ransom[] = new String[n];
for(int ransom_i=0; ransom_i < n; ransom_i++){
ransom[ransom_i] = in.next();
}
Hashtable<Integer,String> hm = new Hashtable<Integer,String>();
for(int magazine_i=0; magazine_i < m; magazine_i++){
hm.put(1,magazine[magazine_i]);
//System.out.println(magazine[magazine_i]);
}
boolean isavailable = false;
for(int ransom_i=0; ransom_i < n; ransom_i++){
isavailable = hm.containsValue(ransom[ransom_i]);
//System.out.println(ransom[ransom_i]+" "+isavailable);
if(isavailable==flase)
{System.out.println("No"); break;}
}
if(isavailable==true)
System.out.println("Yes");
}
}
相反,它给出了 False,我认为问题是散列 table 无法匹配数组的内容及其值。
你的 Hashtable
只包含一个键值对,因为你初始化它的方式:
hm.put(1,magazine[magazine_i]);
先尝试改正
顺便说一句,你的做法是错误的。
要生成 ransom
,您必须确保 ransom
中的所有单词都包含在 magazine
中,并且 magazine
中该单词的计数应该大于或等于 ransom
.
也就是说,如果ransom
包含4个词'today',那么在magazine
中,你必须保证至少有4个词'today'。
因此,您应该这样处理问题:
来自
magazine
,为magazine
构建字数统计图:HashMap<String, Integer> magazineWordCount
。来自
ransom
,为ransom
构建字数统计图:HashMap<String, Integer> ransomWordCount
循环
ransom
键(通过ransomWordCount.keySet()
),检查magazineWordCount.contains(word) && magazineWordCount.get(word) >= ransomWordCount.get(word)
您可以通过这样做来简化代码
- 去掉输入大小的提示
快速失败
Scanner in = new Scanner(System.in); System.out.println("Enter sentence 1"); String s1 = in.nextLine(); System.out.println("Enter sentence 2"); String s2 = in.nextLine(); List<String> s1List = Arrays.asList(s1.split(" ")); for (String w : s2.split(" ")) { System.out.println("loooking for " + w); if (s1List.contains(w) == false) { System.out.println("Failed to find"); return; } } System.out.println("yes");
编辑
如果你想使用哈希表,那么你可以像这样填写它
String [] arr = s1.split(" ");
Hashtable <Integer, String> s1ht = new Hashtable<Integer, String>();
for (int i = 0; i < arr.length; i++) {
s1ht.put(i, arr[i]);
}
其他代码相同(只需要更改变量名)