您的位置:首页 > 编程语言 > Java开发

Java&LeetCode 初入门——136. 只出现一次的数字

2019-01-15 13:19 531 查看

Java&LeetCode 初入门——136. 只出现一次的数字

文内代码全部采用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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: