383. 赎金信
题目:
分析:
一开始我看到这道题,觉得和四数相加很类似,准备创建一个HashMap来存储key:a~z,value:为次数,的这样一个键值对,更新就使用刚刚提到过的 map.getOrDefault(key, default)方法。然后,对赎金信件也进行遍历,使用map.getOrDefault方法更新,只是现在要写成map.put(key, map.getOrDefault-1)来进行更新。最后,遍历map中的 Collection 类型的 values,看是否有小于0的,就能知道结果了。
但是实际上这道题最类似的是我们最开始做的,异位词那道题,使用数组存储即可,没必要用到map,使用数组会更加简单。
代码:
Map:
class Solution {
public boolean canConstruct(String ransomNote, String magazine) {
Map<Character,Integer> map = new HashMap<>();
for(char c : magazine.toCharArray()){
map.put(c, map.getOrDefault(c, 0) + 1);
}
for(char c : ransomNote.toCharArray()){
map.put(c, map.getOrDefault(c, 0) - 1);
}
// Collection<Integer> col = map.values();——这段会报Collection的错误,难道没导入这个包吗。。。
for(int i : map.values()){
if(i < 0)
return false;
}
return true;
}
}
数组:
class Solution {
public boolean canConstruct(String ransomNote, String magazine) {
if(ransomNote.length() > magazine.length())
return false;
int[] resArr = new int[26]; // 为26个英文字符创建数组为hash表,内部存储该字符出现的顺序
// 统计magazine中各个字符的数量
for(char c : magazine.toCharArray()){
resArr[c - 'a']++;
}
// 计算是否能组成ransomNote
for(char c : ransomNote.toCharArray()){
resArr[c - 'a']--;
}
for(int i : resArr){
if(i<0)
return false;
}
return true;
}
}