只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
方法一(通用法)
public class 只出现一次的数字 {
public int singleNumber(int[] nums) {
Set
for (int tmp:nums){
if (!data.add(tmp)) data.remove(tmp);
}
return (int) data.toArray()[0];
}
}
将数组中的每一个元素加入集合中
因为set集合自带去重的功能
所以当没办法加入的时候即(!data.add(tmp))时代表这个元素有两个不是我们要找的
通过remove删除这个元素 最后set中只剩下一个元素 肯定就是我们要的结果
方法二(异或运算)
上代码
public class 只出现一次的数字2 {
public int singleNumber(int[] nums) {
int reduce = 0;
for (int tmp:nums){
reduce = reduce ^ tmp;
}
return reduce;
}
}
前置知识 a^a=0 0^a=a 0^0=0
异或运算也满足 交换律
下面以样例输入为例子

所以我们只需要解决把他们累计异或运算即可
即 reduce = reduce ^ tmp

浙公网安备 33010602011771号