HashMap使用-力扣242做题总结

242. 有效的字母异位词

  • 我的答案
  • 思路优化
  • 出错的知识点(Java)
    • 1、String相关
      • (1)String转换成char数组
      • (2)String不能直接用下标访问
    • 2、HashMap 相关
      • (1)初始化
      • (2)由key得到value
      • (3)遍历map - 增强for循环
      • (4)数组和hashmap的length区别
      • (5)getOrDefault方法

我的答案

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;
    }
}

HashMap使用-力扣242做题总结_第1张图片

思路优化

参考代码随想录

题目“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 都是 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 map = new HashMap();
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 map = new HashMap();

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);
 }

你可能感兴趣的:(LeetCode做题总结,java,leetcode)