法一:桶排序思想
- 题目说,每个集合的值都是1 ~ n,一般我们会想到将数组中元素,挨个作为key放入map中,然后遍历1~n从map中获取value,看看谁是0,谁是2.
- 但是我们可以直接再创建一个数组,长度为n+1,用下标来代表数字,将1~n的个数,放入桶中。比如遍历nums数组是,当前元素是1,就放入下标为1的桶中,此时这个桶有1个元素,当我们有遍历到1时,再次放入下标为1的桶,此时这个桶有2个元素。
class Solution {
public int[] findErrorNums(int[] nums) {
int[] ans = new int[2];
int[] bucket = new int[nums.length + 1];
for (int num : nums) bucket[num]++;
for (int i = 1; i <= nums.length; i++) {
if (bucket[i] == 0) ans[1] = i;
else if (bucket[i] == 2) ans[0] = i;
if (ans[0] != 0 && ans[1] != 0) break;
}
return ans;
}
}
法二:位运算
class Solution {
public int[] findErrorNums(int[] nums) {
int n = nums.length;
int xor = 0;
for(int num:nums) xor ^= num;
for(int i = 1;i<=n;i++) xor^=i;
int lowbit = xor & (-xor);
int num1 = 0, num2 = 0;
for(int num:nums){
if((num & lowbit)==0) num1^=num;
else num2 ^= num;
}
for(int i = 1;i<=n;i++){
if((i & lowbit)==0) num1^=i;
else num2^=i;
}
for(int num:nums){
if(num==num1) return new int[]{num1,num2};
}
return new int[]{num2,num1};
}
}