242. 有效的字母异位词
我的答案
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数组有默认值。