题目:
给你一个非空整数数组nums,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现一次的元素。你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。
案例:
思路:
方法1.使用set集合解决
方法2.使用位运算解决
代码:
方法1:使用set集合解题
class Solution {
public int singleNumber(int[] nums) {
Set<Integer> set = new HashSet<>();
for(int i = 0;i < nums.length;i++){
//如果添加的元素,在set集合中已经存在,移除该数据
if(!set.add(nums[i])){
set.remove(nums[i]);
}
}
return (int)set.toArray()[0];
}
}
运行截图:
方法2:使用位运算解题
class Solution {
public int singleNumber(int[] nums) {
int result = 0;
for(int i = 0;i < nums.length;i++){
result^=nums[i];
}
return result;
}
}
运行截图
解析:
方法1.使用set集合解决
我们遍历数组中的元素,一个个添加到set集合中,如果添加失败,则说明set集合中已经存在该元素,就把它移除掉,当遍历完数组的所有元素,这时候set集合中只会剩余一个数字,然后把set集合转换为数组,然后根据索引把数组索引为0的数字取出来。
方法2.使用位运算解决
相同为0,不同为1,不进位。底层运算采用二进制运算。
1^1=0;
1^0=1;
0^1=1;
0^0=0;
参考leetcode官网:参考leetcode官网