傻雕巴尼
题目地址
题目描述
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
题目思路
暴力搜索
- 如果不看o(1)的时间复杂度,当然是暴力搜索来的最简单
- 从前往后一个一个比,如果没有重复的就返回该值
hash表
- 第二次我想到了hash表,不过因为想要取巧倒是出了点小波折,因为我没想到还有负数。第一次写的代码如下:
public int singleNumber(int[] nums) {
int[] temp = new int[100];
int singleNumber = 0;
for (int num : nums) {
if (++temp[num] == 1){
singleNumber = num;
}
}
return singleNumber;
}
- 本来想着数组天生就是一个hash表,但还是图样图森破。
异或
- 这个算是奇淫技巧了,利用异或的性质:
1^1 = 0
1 ^ 1 ^2 = 2
代码实现
Hash
int singleNumber = 0;
Map<Integer,Integer> map = new HashMap<>(100);
for(int num: nums){
map.put(num,map.get(num) == null ? 1 : map.get(num)+1);
}
for(int num: nums){
if(map.get(num) == 1){
singleNumber = num;
break;
}
}
return singleNumber;
异或:
public int or(int[] nums){
int singleNumber = 0;
for (int num : nums) {
singleNumber ^= num;
}
return singleNumber;
}
本文介绍了一种寻找数组中唯一出现一次的元素的方法。通过暴力搜索、哈希表和异或操作三种方式实现,其中异或操作提供了高效且节省空间的解决方案。
673

被折叠的 条评论
为什么被折叠?



