例题:
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
相关标签
位运算
数组
--------------------------------------------------------------------------------------------------------------------------------
异或运算
相异为1,相同为0
满足:
0 ^ a = a;
1 ^ a = 0 (a != 0);
即 0异或任何数a都为a本身,1异或任何数a都为a取反
a ^ a = 0;
a ^ b = b ^ a;
a ^ b ^ a = a ^ a ^ b = b;
--------------------------------------------------------------------------------------------------------------------------------
解决方法
1.位运算(异或运算)解决
class Solution {
public int singleNumber(int[] nums) {
int len = nums.length;
if(len == 0)
return 0; //保护
int fin = nums[0];
for(int i = 1; i < len; i++)
fin ^= nums[i]; //对每个元素进行异或运算
return fin;
}
}
优点:
时间性能良好(位运算高效)
2.Set解决(集合处理)
class Solution {
public int singleNumber(int[] nums) {
Set<Integer> set = new HashSet<>(); //定义哈希集合(此处仅使用一般集合的性质)
for(int i = 0;i < nums.length; i++){
if(!(set.add(nums[i]))) //向集合中添加元素,添加成功返回true,失败返回false
set.remove(nums[i]); //在集合中删除“在传入数组中出现两次的数字”
}
return (int)set.toArray()[0]; //return集合(此时只含有一个数字)
}
}
Set是一个接口,HashSet继承了这个接口,定义一个上转型集合
Set相关函数:
1.add(Object obj):向Set集合中添加元素,添加成功返回true,否则返回false
2.size() :返回Set集合中的元素个数
3.remove(Object obj) : 删除Set集合中的元素,删除成功返回true,否则返回false。
4.isEmpty() :如果Set不包含元素,则返回 true ,否则返回false
5.clear() : 移除此Set中的所有元素
6.iterator() :返回在此Set中的元素上进行迭代的迭代器
7.contains(Object o):如果Set包含指定的元素,则返回 true,否则返回false