每日刷题:第九天 赎金信

很简单的一道题,判断a数组的字符能否由b数组的字符组成,且b数组的字符不可复用

思路:构建哈希map,key放字符,value放出现的次数,那么先遍历一遍b数组,若当前字符存在,则value + 1 ,若当前字符不存在则put进去;之后遍历a数组,若当前map中没有当前字符或者当前字符指向的数字为0,则直接返回false,否则当前字符指向的数字-1;遍历完返回true

优化:翻到下面,发现数组只有小数构成,这就更好做了,直接使用数组承担哈希表的功能,数组下标即为对应的ascill码%25的值,数组值即为出现次数

思路一实现代码(java)

class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
        //使用哈希map,key是字符,value是个数
        Map<Character,Integer> map = new HashMap<>();
        //遍历magazine,将字符输入进map里面
        char[] m =  magazine.toCharArray();
        for (int i = 0; i < m.length; i++)
        {
            //若内部已存在
            if (map.get(m[i]) != null)
            {
                map.put(m[i],map.get(m[i])+1);
            }else
            {
                map.put(m[i],1);
            }
        }
        //遍历ransomNote
        char[] r = ransomNote.toCharArray();
        for (char c : r)
        {
            //若不存在该字符,直接返回false
            if (map.get(c) == null || map.get(c) == 0)
            {
                return false;
            }
            //若存在,该字符个数减1
            map.put(c,map.get(c)-1);
        }
        return true;
    }
}

优化后的代码(java):

class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
        //创建哈希数组
        int[] nums = new int[26];
        //遍历magazine,将字符输入进map里面
        char[] m =  magazine.toCharArray();
        for (int i = 0; i < m.length; i++)
        {
            //对应位置++
           nums[m[i]%25] ++;
        }
        //遍历ransomNote
        char[] r = ransomNote.toCharArray();
        for (char c : r)
        {
            //若为0,直接返回false
            if (nums[c%25] == 0)
            {
                return false;
            }
            //若存在,该字符个数减1
            nums[c%25]--;
        }
        return true;
    }
}

事实证明哈希运算确实挺耗时间的

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值