标签:shm find tab should pad nbsp order pac int
刷leetcode时遇到的一个问题:Given a pattern
and a string str
, find if str
follows the same pattern.
Here follow means a full match, such that there is a bijection between a letter in pattern
and a non-emptyword in str
.
Examples:
pattern = "abba"
, str = "dog cat cat dog"
should return true.
pattern = "abba"
, str = "dog cat cat fish"
should return false.
pattern = "aaaa"
, str = "dog cat cat dog"
should return false.
pattern = "abba"
, str = "dog dog dog dog"
should return false.
正确的解决方法:
public boolean wordPattern(String pattern, String str) {
String[] words = str.split(" ");
if(words.length != pattern.length())
return false;
HashMap<Object, Integer> map = new HashMap<Object, Integer>();
for(Integer i=0;i<words.length;i++){
if (map.put(pattern.charAt(i), i) != map.put(words[i], i))
return false;
}
return true;
}
一开始,for循环我写成了:for(int i=0;i<words.length;i++),运行结果错误。
检查发现是Integer的127与128问题。
首先,Integer类中,当数值在(-128,127)之间时,引用指向的是同一个堆内存地址。超过这个范围以后,才会分配新的内存地址。
所以Integer i1 = 127;Integer i2 = 127;i1==i2。而Integer i1 = 128;Integer i2 = 128;i1!=i2
错误的方式for(int i=0;i<words.length;i++):
由于存int类型进map时,自动将int类型的i封装成Integer类型的i,所以在map.put(pattern.charAt(i), i),map.put(words[i], i)时,存入的是两个new Integer的i对象。而Integer的对象在大于127时是不相等的,所以map的值是不相等的,返回为false;
正确的方式for(Integer i=0;i<words.length;i++):
在初始化i时,就把i封装成Integer类型,所以map.put(pattern.charAt(i), i),map.put(words[i], i)中,存入的是同一个Integer对象,自然是相等的。
标签:shm find tab should pad nbsp order pac int
原文地址:http://blog.51cto.com/13580976/2063315