383. 赎金信

383. 赎金信

题目:

383. 赎金信 - 力扣(LeetCode)

分析:

一开始我看到这道题,觉得和四数相加很类似,准备创建一个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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江弦凤歌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值