题目描述:
一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。
限制:
2 <= nums.length <= 10000
示例 1:
输入:nums = [4,1,4,6]
输出:[1,6] 或 [6,1]
示例 2:
输入:nums = [1,2,10,4,1,4,3,3]
输出:[2,10] 或 [10,2]
代码如下:
进阶:要求时间复杂度是O(n),空间复杂度是O(1)。
使用异或的性质:
class Solution {
public int[] singleNumbers(int[] nums) {
int ans = 0;
for (int num : nums) {
ans ^= num;
}
int rightOne = ans & (~ans + 1);//提取出最右侧的1
int res = 0;
for (int num : nums) {
if ((rightOne & num) == 0) {
res ^= num;
}
}
return new int[]{ans ^ res, res};
}
}
一般写法:
class Solution {
public int[] singleNumbers(int[] nums) {
HashMap<Integer, Integer> map = new HashMap<>();
int n = nums.length;
int[] arr = new int[2];
int k = 0;
for (int num : nums) {
map.put(num, map.getOrDefault(num, 0) + 1);
}
for (var entry : map.entrySet()) {
if (entry.getValue() == 1) {
arr[k] = entry.getKey();
k++;
}
}
return arr;
}
}