自学内容网 自学内容网

LeetCode每日一题记录

2024/10/12-求出出现两次数字的XOR值

3158. 求出出现两次数字的 XOR 值

给你一个数组 nums ,数组中的数字 要么 出现一次,要么 出现两次。

请你返回数组中所有出现两次数字的按位 XOR 值,如果没有数字出现过两次,返回 0 。

class Solution {
    public int duplicateNumbersXOR(int[] nums) {
        /**
            XOR 异或操作
            在java中异或操作使用 ^ 实现
            例如,整数类型的异或运算:int a = 5; int b = 7; int result = a ^ b;。这里,5 的二进制表示为 0101,7 的二进制表示为 0111,进行异或运算后结果为 0010,即十进制的 2。
            在 Java 中,布尔类型也可以进行异或运算。例如:boolean c = true; boolean d = false; boolean res = c ^ d;,结果为 true,因为 true 和 false 不同,异或结果为 true。

            思路:1. 先排序,然后遍历一遍数组,因为相同元素会挨着,而且数组元素最多出现两次,所以只要看后面有没有即可
                    用list存储
                  2. 不排序了,直接用哈希表记录次数,因为元素的大小有限制,则可以直接使用数组作为哈希表
         */
        Arrays.sort(nums); // O(nlogn)
        var list = new ArrayList<Integer>();
        for(int i=1; i<nums.length; i++) {
            if(nums[i] == nums[i-1]) {
                list.add(nums[i]);
            }
        } // O(n)
        if(list.size() == 0) return 0;
        int ans = list.get(0);
        for(int i=1; i<list.size(); i++) {
            ans ^= list.get(i); 
        }
        return ans;
    }
}
class Solution {
    public int duplicateNumbersXOR(int[] nums) {
        boolean[] exist = new boolean[51];
        int ans = 0;
        for (int num : nums) {
            if (exist[num]) {
                ans ^= num;
            }
            exist[num] = true;
        }
        return ans;
    }
}


原文地址:https://blog.csdn.net/m0_47411815/article/details/142868115

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!