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(); } }
执行结果: