HashMap使用-力扣242、383做题总结

我的答案

class Solution {
    public boolean isAnagram(String s, String t) {
        //String变成数组,toCharArray 
        //String不能用下标访问
        char[] ss = s.toCharArray();
        char[] tt = t.toCharArray();
        HashMap<Character,Integer> map = new HashMap<Character, Integer>();
        //s
        for(int i=0; i<ss.length; i++) {
            if(!map.containsKey(ss[i])) {//不存在
                map.put(ss[i], 1);
            } else {
                map.put(ss[i],map.get(ss[i])+1);
            }
        }
        //t
        for(int i=0; i<tt.length; i++) {
            if(!map.containsKey(tt[i])) {//不存在
                return false;
            } else {
                map.put(tt[i],map.get(tt[i])-1);//!!请注意要加一 不能++
            }
        }

        //数组和hashmap的length
        for(Character key : map.keySet()) {
            if(map.get(key) != 0) {
                return false;
            }
        }
        return true;
    }
}

在这里插入图片描述

思路优化

参考代码随想录

题目“s 和 t 仅包含小写字母”,且字母小a到字母小b的ASCII码是连续的(a是97)
什么时候用数组、set、map?
在哈希值比较小、范围比较小(26个字母)的情况下用数组就可以。

出错的知识点(Java)

1、String相关

(1)String转换成char数组

toCharArray方法

String s="XXXXX";
char[] ss = s.toCharArray();

(2)String不能直接用下标访问

String s 可以通过 s.charAt(i) 访问

public char charAt(int index)

// String s
for (int i = 0; i < s.length(); i++) {
    record[s.charAt(i) - 'a']++;     // 并不需要记住字符a的ASCII,只要求出一个相对数值就可以了
}

2、HashMap 相关

(1)初始化

首先注意<key , value>中的 key 和 value 都是 Object。所以 要用到包装类:char->Character, int->Integer。

HashMap<Character,Integer> map = new HashMap<Character, Integer>();

(2)由key得到value

get方法
public Value get(Object key)

map.put(ss[i],map.get(ss[i])+1);

调用函数的时候向上转型?或者装箱拆箱。传进去的ss[i]是char,但是get方法里使用Object接收的。
这里的 map.get(ss[i])+1) 也不可以用自增运算符++代替。 Integer对象执行++操作之后是返回一个新的Integer对象。

https://www.yisu.com/zixun/195481.html

我猜测这里的+1其实1自动装箱为对象然后进行运算。但是这两天IDEA到期了,还看不了源码。

(3)遍历map - 增强for循环

//HashMap<Character,Integer> map = new HashMap<Character, Integer>();
for(Character key : map.keySet()) {
     if(map.get(key) != 0) {
         return false;
     }
 }

(4)数组和hashmap的length区别

数组 char[] a 的长度为 a.length
Hashmap map的长度为 map.length()
Hashmap 是一个类,访问类方法得到它的长度,类方法的访问需要加括号。然而数组char[]不是类。

(5)getOrDefault方法

public V getOrDefault(Object key, V defaultValue)
返回指定键映射到的值,如果此映射不包含键的映射, defaultValue

请看下面代码的逻辑:如果 map中没有键 tt[i] ,那么就加入 map,value设置为1。如果本来就存在键 tt[i] ,value加一。其实就是计数。

//输入String t;
//char[] tt = t.toCharArray();
//HashMap<Character,Integer> map = new HashMap<Character, Integer>();

for(int i=0; i<ss.length; i++) {
       if(!map.containsKey(ss[i])) {//不存在
           map.put(ss[i], 1);
       } else {
           map.put(ss[i],map.get(ss[i])+1);
       }
   }

这一段代码可以用 getOrDefault 方法优化

 for (int i = 0; i < s.length(); i++) {
     char ch = s.charAt(i);
     map.put(ch, table.getOrDefault(ch, 0) + 1);
 }

383. 赎金信

class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
        int[] letters = new int[26];
        char[] m_a = magazine.toCharArray();//char
        char[] r_a = ransomNote.toCharArray();

        for(int i=0; i<m_a.length; i++) {
            letters[m_a[i]-'a'] += 1;
        }

        for(int i=0; i<r_a.length; i++) {
            letters[r_a[i]-'a'] -= 1;
            if(letters[r_a[i]-'a'] < 0) {
                return false;
            }
        }
        return true;
    } 
}

Java知识点

Java数组有默认值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值