383. 赎金信
简单
给你两个字符串:ransomNote
和 magazine
,判断 ransomNote
能不能由 magazine
里面的字符构成。
如果可以,返回 true
;否则返回 false
。
magazine
中的每个字符只能在 ransomNote
中使用一次。
用之前同样的 map方法可以做出来但是,map 会更耗时和空间,所以就这道题而言,
是费时的!数据量大的话就能体现出来差别了。 所以数组更加简单直接有效!
class Solution {
public boolean canConstruct(String ransomNote, String magazine) {
if(ransomNote.length()>magazine.length()){
return false;
}
HashMap<Character,Integer> map = new HashMap<Character,Integer>();
for (int i=0;i<magazine.length();i++){
char ch = magazine.charAt(i);
map.put(ch,map.getOrDefault(ch,0)+1);
}
for(int j=0;j<ransomNote.length();j++){
char ch= ransomNote.charAt(j);
map.put(ch,map.getOrDefault(ch,0)-1);
if(map.get(ch)<0){
return false;
}
}
return true;
}
}
随想录参考代码:
注意这里:
class Solution {
public boolean canConstruct(String ransomNote, String magazine) {
// 定义一个哈希映射数组
int[] record = new int[26];
// 遍历
for(char c : magazine.toCharArray()){
record[c - 'a'] += 1;
}
for(char c : ransomNote.toCharArray()){
record[c - 'a'] -= 1;
}
// 如果数组中存在负数,说明ransomNote字符串总存在magazine中没有的字符
for(int i : record){
if(i < 0){
return false;
}
}
return true;
}
}
454. 四数相加 II
中等
给你四个整数数组 nums1
、nums2
、nums3
和 nums4
,数组长度都是 n
,请你计算有多少个元组 (i, j, k, l)
能满足:
0 <= i, j, k, l < n
nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0
注意这里数组长度都是相同,并且4个数只要是来自四个数组就好,相同也没有关系。用map 很好记录元素出现的次数
class Solution {
public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
int res=0;
Map<Integer,Integer> map=new HashMap<Integer,Integer>();
for(int i=0;i<nums1.length;i++){
for(int j=0;j<nums2.length;j++){
int sum =nums1[i]+nums2[j];
map.put(sum,map.getOrDefault(sum,0)+1);
}
}
for(int i=0;i<nums3.length;i++){
for(int j=0;j<nums4.length;j++){
int sum=nums3[i]+nums4[j];
if(map.containsKey(0-sum)){
res+=map.get(0-sum);
}
}
}
return res;
}
}