一、今日刷题
1. 第六部分:哈希表 – 383.赎金信
答案代码:
完全是自己的思路:将 magazine 中的字符作为 key, 出现的次数作为 value 存入 map, 之后遍历 ransomNote,每遍历到一个字符,便在 map 中查找是否有对应的 key,若有则将其 value - 1,若无则直接返回false
package HashSet;
import java.util.HashMap;
import java.util.Map;
/**
* @author: LYZ
* @date: 2022/2/14 20:39
* @description: 383.给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。
*
* 如果可以,返回 true ;否则返回 false 。
* magazine 中的每个字符只能在 ransomNote 中使用一次。
*/
public class CanConstruct {
public static void main(String[] args) {
CanConstruct canConstruct = new CanConstruct();
boolean ans = canConstruct.canConstruct("aa", "ab");
System.out.println(ans);
}
public boolean canConstruct(String ransomNote, String magazine) {
Map<Character, Integer> map = new HashMap<>();
for (int i = 0; i < magazine.length(); i++) {
char c = magazine.charAt(i);
int frequency = map.getOrDefault(c, 0);
map.put(c, frequency + 1);
}
for (int j = 0; j < ransomNote.length(); j++) {
char cRansomNote = ransomNote.charAt(j);
if (map.containsKey(cRansomNote) && map.get(cRansomNote) > 0) {
map.put(cRansomNote, map.get(cRansomNote) - 1);
} else {
return false;
}
}
return true;
}
}
2.错误
第一次提交出现了空指针异常,原因在
if (map.containsKey(cRansomNote) && map.get(cRansomNote) > 0) {
map.put(cRansomNote, map.get(cRansomNote) - 1);
} else {
return false;
}
if判断语句中缺少了判断key是否存在的语句,导致如果ransomNote正在遍历到的字符未在magazine中出现,会有空指针异常。