leetcode| Valid Anagram
Given two strings s and t, write a function to determine if t is an anagram of s.
For example,
s = "anagram", t = "nagaram", return true.
s = "rat", t = "car", return false.
题目:这个题目意思是判断两个字母是不是构造一样,只是字母顺不一样
思路:又是hash,只需将两个字母的及字母出现的次数得出后逐一比较每个字母的值及其次数,希望有更好方法的同仁不吝赐教,但是实现的时候,有一段逻辑让我有了另外的收获,这个很珍贵,下面是Accepted的代码,注意粗体部分
public boolean isAnagram(String s, String t) {
Map<Character, Integer> map_s = new HashMap<Character, Integer>();
Map<Character, Integer> map_t = new HashMap<Character, Integer>();
int s_len = s.length();
int t_len = t.length();
if(s_len!=t_len) return false;
for (int i = 0; i < s_len; i++) {
char c = s.charAt(i);
Integer count = map_s.get(c);
if (count == null) {
map_s.put(c, 1);
} else {
map_s.put(c, count + 1);
}
}
for (int i = 0; i < t_len; i++) {
char c = t.charAt(i);
Integer count = map_t.get(c);
if (count == null) {
map_t.put(c, 1);
} else {
map_t.put(c, count + 1);
}
}
boolean flag = true;
for(Character c : map_s.keySet()){
int cc = map_s.get(c)==null?0:map_s.get(c);
int tc = map_t.get(c)==null?0:map_t.get(c);
if(tc!=cc) {
flag = false;
}
}
return flag;
}
粗体部分我当时是这么写的,
if(map_s.get(c)!=map_t.get(c)) {
flag = false;
}
这么写,在字符少的情况下是没有问题的,字符一多,这段逻辑就报错,为什么呢?
相信大家肯定和我一样知道这么一回事但是没在意,就是自动拆装箱,为了让基础类型的int,long,double参与面相对象的编程,java针对每一个基本类型封装了Integer,Long,Double等相应的类,在用的时候一般可以通过自动拆装箱与对应的基本类型互换,但是对于其中的转换机制不了解,导致出错,Integer转换是调用了valueOf方法
public static Integer valueOf(int i) {
assert IntegerCache.high >= 127;
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
valueOf处理的时候,-128-127区间的数,直接从缓存中取出返回,而不在这个byte范围内的它是new Integer(i)返回,这就导致我之前那么比较是错误的,因为二者都是new出来的不同对象,即使值相同,==比较的结构也是false