您的位置:首页 > 其它

leetcode 136. Single Number

2016-09-13 20:55 423 查看
Given an array of integers, every element appears twice except
for one. Find that single one.

我的代码:

public int singleNumber(int[] nums) {
HashMap<Integer,Integer>a = new HashMap<Integer,Integer>();
for(int i:nums){
if(!a.containsKey(i)){
a.put(i,1);
}else{
if(a.get(i)==1){
a.remove(i);
}
}
}
int i=0;
for (Map.Entry<Integer, Integer> entry : a.entrySet()) {
i = entry.getKey();
}
return i;
}

用HashMap存放已出现的数字,再次出现时删除。但是Value这个值是废的,而且最后明知道只剩一个数字还要用遍历来return。感觉十分不好。

Discuss里还有另外几种解法:

public int singleNumber(int[] nums) {
int result = 0;
for(int i=0;i<nums.length;i++) result ^= nums[i];
return result;
}

一个数和自身异或得0,和0异或是自身。这样就把两次一样的数全抵消了。十分美妙。

public int singleNumber(int[] nums) {
if(nums.length==1) {

return nums[0];
}
// First sort the arrays
Arrays.sort(nums);
//Now start looping
for(int i=0;i<nums.length;i++) {
// case 1 unique number is first
if( i==0 && nums[i]!=nums[i+1] ) {
return nums[i];
}
else if(i+2<nums.length-1 && (nums[i]!=nums[i+1])&&(nums[i+1]!=nums[i+2])) {
return nums[i+1];
}
// case 2 unique number is somewhere in middle
else if(i==nums.length-1) {
if(nums[i]!=nums[i-1]) {
return nums[i];
}
}
// case 3 unique number is last one
}
return -1;
}
先排个序再比较。十分美妙。


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode