只出现一次的数字(Java语言)
程序员文章站
2022-06-09 20:48:06
原题链接136.只出现一次的数字给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?思想:方法1:利用位运算符比较强大利用异或运算法性质(1):0与任何数异或都得另外的那个数性质(2):1异或任何数=任何数取反性质(3):满足交换律和结合律1 xor 2 xor 3 xor 2 = (1 xor 1) xor (2 xor 2) xor 3 = 0 xor 0...
原题链接
136.只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
解题思路:
方法1:利用位运算符比较强大
利用异或运算法
性质(1):0与任何数异或都得另外的那个数
性质(2):1异或任何数=任何数取反
性质(3):满足交换律和结合律
1 xor 2 xor 3 xor 2 = (1 xor 1) xor (2 xor 2) xor 3 = 0 xor 0 xor 3 = 0 xor 3 = 3
性质(4):判断两个数是否相等可以用a异或b==0
性质(5):交换两个数可以
a=a异或b
b=b异或a
a=a异或b
方法2:
因为每个元素最多出现两次,可以利用set特性
当添加重复元素时,第二次会添加失败,说明set中已有相同元素,所以调用方法删除它
最后利用迭代器返回集合中第一个即为答案
代码:
方法1:
/**
*作者:魏宝航
*2020年11月25日,上午8:51
*/
class Solution {
public int singleNumber(int[] nums) {
int res=0;
for(int i:nums){
res^=i;
}
return res;
}
}
方法2:
/**
*作者:魏宝航
*2020年11月25日,上午8:34
*/
class Solution {
public int singleNumber(int[] nums) {
Set<Integer> set=new HashSet<>();
for(int i:nums){
if(set.add(i)){
}
else{
set.remove(i);
}
}
return set.iterator().next();
}
}
执行结果:
本文地址:https://blog.csdn.net/m0_47256162/article/details/110109128