题目:
讨论里有童鞋说 map.containsKey() is actually an O(logN) search.
Given an array of integers, every element appears twice except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
数组里元素都出现两次,找出只出现一次的那个,要求线性时间不使用额外存储空间
太次不会做,先写了个hash的试了下居然accepted了 = =
public int singleNumber(int[] A) {
<span style="white-space:pre"> </span>Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i=0; i<A.length; i++) {
<span style="white-space:pre"> </span>if (map.containsKey(A[i])) {
<span style="white-space:pre"> </span>map.remove(A[i]);
<span style="white-space:pre"> </span>} else {
<span style="white-space:pre"> </span>map.put(A[i], 1);
<span style="white-space:pre"> </span>}
}
<span style="white-space:pre"> </span>return map.entrySet().iterator().next().getKey();
}
讨论里有童鞋说 map.containsKey() is actually an O(logN) search.
看了下提示说可以用按位操作,智商太低又没碰过这种题,死活想不出来直接上网搜了
结论是 一个数和自身进行异或运算得到0, 和0异或还是自身
public int singleNumber(int[] A) {
int result = 0;
for (int i=0; i<A.length; i++) {
result ^= i;
}
return result;
}
百度关键词"Single Number"第一篇博客园的大神又扩展了一下,http://www.cnblogs.com/changchengxiao/p/3413294.html 写得好棒总结到360度无死角,下面还热心回复了几个读者并给了示例,怒点一赞,趁热把Single Number II做了
<span style="white-space:pre"> </span>public int singleNumber(int[] A) {
<span style="white-space:pre"> </span>int result = 0;
<span style="white-space:pre"> </span>for (int i=0; i<32; i++) {
<span style="white-space:pre"> </span>int temp = 0;
<span style="white-space:pre"> </span>for (int j=0; j<A.length; j++) {
<span style="white-space:pre"> </span>temp += A[j] >> i & 1;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>result += temp % 3 << i;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>return result;
<span style="white-space:pre"> </span>}