题目
给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。
示例 1 :
输入: nums = [2,2,1]
输出: 1
题解
方式一:哈希表
public int singleNumber(int[] nums) {
// 非线形额外空间,记录所有元素出现的次数
HashMap<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
map.put(nums[i], map.getOrDefault(nums[i], 0) + 1);
}
AtomicInteger result = new AtomicInteger();
// 遍历找到只出现一次的元素
map.forEach((k, v) -> {
if (v == 1) {
result.set(k);
}
});
return result.get();
}
方式二:位运算
public int singleNumber(int[] nums) {
// 0 与任意数 异或 等于原来的数
int result = 0;
for (int num: nums) {
// 两个相同的数 异或 操作后等于0
result ^= num;
}
return result;
}
总结
算法:位运算
数据结构:哈希表