文内代码全部采用JAVA语言。
题目
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
测试用例
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
个人解法
写了一个Map,来统计数量。Key对应元素,Value对应个数。问题就是比较慢。在存取数据的过程中很浪费时间。
执行用时: 28 ms, 在Single Number的Java提交中击败了15.93% 的用户
class Solution {
public int singleNumber(int[] nums) {
Map<Integer, Integer> a=new HashMap<>();
for (int i = 0; i < nums.length; i++) {
if (a.containsKey(nums[i])) {
a.put(nums[i], 2);
}else {
a.put(nums[i], 1);
}
}
Set<Integer> set=a.keySet();
Iterator<Integer> it=set.iterator();
int ans=0;
while (it.hasNext()) {
int b=(Integer)it.next();
int c=(Integer)a.get(b);
if (c==1) {
ans=b;
break;
}
}
return ans;
}
}
大神解法
方法
求异或
思路
两个相同就删去,不同就存下来。由于只有一个数出现次数为1次,其他数据在异或的过程中都会两两抵消。比如[2,4,6,4,2],求异或时写成二进制[001,010,100,010,001],001与001异或为000,010与010异或为000,最后只剩000与100异或,答案显而易见。
算法
执行用时: 1 ms, 在Single Number的Java提交中击败了99.50% 的用户
代码简单,好理解。
class Solution {
public int singleNumber(int[] nums) {
int a=0;
for (int i = 0; i < nums.length; i++) {
a^=nums[i];//异或运算
}
return a;
}
}