I just solved the Hash Tables: Ransom Note problem on Hackerrank using both Java-8 and Java-7. Given m words in a magazine and the n words in the ransom note, print Yes
if a kidnapper can replicate his ransom note exactly (case-sensitive) using whole words from the magazine; otherwise, print No
. 1 ≤ m, n ≤ 30000.
I am looking for suggestions regarding the efficiency, coding style and if this is the best way to solve this kind of problem.
Java-7
public class RansomeNotesJava7 {
public static void main(String[] args) throws Exception{
Scanner in = new Scanner(new File("input.txt"));
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();
}
if(getRansom(m,n,magazine,ransom))
System.out.println("Yes");
else
System.out.println("No");
}
private static boolean getRansom(int m, int n, String[] magazine, String[] ransom) {
if(m < n)
return false;
Map<String, Long> magazineMap = getFrequencyMapFromArray(magazine); //Arrays.stream(magazine).collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
Map<String, Long> ransomMap = getFrequencyMapFromArray(ransom); //Arrays.stream(ransom).collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
System.out.println(magazineMap);
System.out.println(ransomMap);
for(String key : ransomMap.keySet()){
if(!magazineMap.containsKey(key))
return false;
if(magazineMap.get(key) < ransomMap.get(key))
return false;
}
return true;
}
private static Map<String, Long> getFrequencyMapFromArray(String[] arr) {
Map<String, Long> map = new HashMap<>();
for(String key : arr){
if(map.containsKey(key))
map.put(key, map.get(key)+1);
else
map.put(key, new Long("1"));
}
return map;
}
}
Java-8
public class RansomNotes {
public static void main(String[] args) throws Exception {
Scanner in = new Scanner(new File("input.txt"));
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();
}
if (getRansom(m, n, magazine, ransom))
System.out.println("Yes");
else
System.out.println("No");
}
private static boolean getRansom(int m, int n, String[] magazine, String[] ransom) {
if (m < n)
return false;
Map<String, Long> magazineMap = getFrequencyMapFromArray(magazine);
Map<String, Long> ransomMap = getFrequencyMapFromArray(ransom);
System.out.println(magazineMap);
System.out.println(ransomMap);
return (ransomMap.entrySet().stream()
.filter(i -> (!magazineMap.containsKey(i.getKey()) || magazineMap.get(i.getKey()) < i.getValue()))
.count() == 0);
}
private static Map<String, Long> getFrequencyMapFromArray(String[] arr) {
return Arrays.stream(arr)
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
}
}
anyMatch()
:return !ransomMap.entrySet().stream() .anyMatch( i -> (!magazineMap.containsKey(i.getKey()) || magazineMap.get(i.getKey()) < i.getValue()));
\$\endgroup\$