--- title: "数组中只出现一次的两个数字" created: 2025-11-28 tags: - 算法 --- # 数组中只出现一次的两个数字 ## 题目 [数组中只出现一次的两个数字](https://www.acwing.com/problem/content/description/69/) ![[image-2799e9d2.png]] ## 思路分析 在学异或的时候知道了怎么去找出只出现一次的一个数 原理就是 两个相同的数做异或等于没做 那把所有的数异或起来 结果就是这个出现一次的数了 但是这里有不一样的地方就是 出现一次的数有两个 也就是说 当我们把所有的数异或起来后 得到的那个值不是唯一的x了 而是x^y 那该怎么把x和y分别找出来呢 其实也很简单 他们之所以异或不为0 就说明x和y肯定存在一位不相同 那这不相同的一位就体现在 x^y的二进制表示中的1处 那么 就可以根据这个1 把所有的数分为两半 该位为1的一半和该位为0的一半 x和y一定各在一边 那这样就变成了一开始的问题 找一个出现一次的数 把所有该位为1的数异或起来 找到x后 y直接通过x^xy就可以得到了 ## 代码实现 ```java class Solution { public: vector findNumsAppearOnce(vector& nums) { int xy=0; for(auto num:nums) xy^=num; //xy=x^y //找到xy中1的位置 int k=0; while((xy>>k&1)==0) k++; //在对所有该位为1的数做一次异或(对所有该位为0的数做也行) int x=0; for(auto num:nums) { if((num>>k&1)==1) //if((num>>k&1)==0) x^=num; } //那么就有x^y x了 y直接把x^y再^一次x就可以得到 int y=xy^x; return {x,y}; } }; ``` ## 同类题型 ## 视频讲解 --- ⬅️ [[按要求计算|按要求计算]] 🏠 [[00-刷题理模型]] ➡️ [[数组中唯一只出现一次的数字|数组中唯一只出现一次的数字]]