- 1、题目描述:
图片说明

- 2、题目链接:
https://www.nowcoder.com/practice/e02fdb54d7524710a7d664d082bb7811?tpId=117&&tqId=34997&rp=1&ru=/ta/job-code-high&qru=/ta/job-code-high/question-ranking

-3、 设计思想:
图片说明
详细操作流程看下图:

图片说明
-4、视频讲解链接B站视频讲解

-5、代码:
c++版本:

 class Solution
{
public:
    void FindNumsAppearOnce(vector<int> data,int* num1,int *num2)
    {
        int n = data.size();//求出数组的长度
        int eor = 0; //用来保存那两个只出现1次的数的异或值
        for(int i = 0; i &lt; n; i ++)
        {
            eor ^= data[i];//将整个数组异或
        }
        /// eor = a ^ b
        /// eor != 0
        /// eor必然有一个位置上是1
        int rightOne = eor &amp; (~eor + 1); // 提取出最右的1
        int onlyOne = 0;//用来保存只出现1次的数的其中的那一个
        for(int i = 0; i &lt; n; i ++)
        {
            if((data[i] &amp; rightOne) != 0)
            {
                onlyOne ^= data[i];//寻找那个数
            }
        }
        *num1 = onlyOne;
        *num2 = (eor ^ onlyOne);

    }
};

Java版本:

//num1,num2分别为长度为1的数组。传出参数
//将num1[0],num2[0]设置为返回结果
public class Solution {
    public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
        int n = array.length;//求出数组的长度
        int eor = 0;//用来保存那两个只出现1次的数的异或值
        for(int i = 0; i &lt; n; i ++)
        {
            eor ^= array[i];//将整个数组异或
        }
        /// eor = a ^ b
        /// eor != 0
        /// eor必然有一个位置上是1
        int rightOne = eor &amp; (~eor + 1); /// 提取出最右的1
        int onlyOne = 0;//用来保存只出现1次的数的其中的那一个
        for(int i = 0; i &lt; n; i ++)
        {
            if((array[i] &amp; rightOne) != 0)
            {
                onlyOne ^= array[i];//寻找那个数
            }
        }
        num1[0] = onlyOne;
        num2[0] = (eor ^ onlyOne);
    }
}

Python版本:

# -*- coding:utf-8 -*-
class Solution:
    # 返回[a,b] 其中ab是出现一次的两个数字
    def FindNumsAppearOnce(self, array):
        # write code here
        n  = len(array)#求出数组的长度
        eor = 0#用来保存那两个只出现1次的数的异或值
        for i in range(n):#将整个数组异或
            eor ^= array[i]
        rightOne = eor &amp; (~eor + 1)#提取出最右的1
        onlyOne = 0#用来保存只出现1次的数的其中的那一个
        for i in range(n): 
            if ((array[i] &amp; rightOne) != 0):
                onlyOne ^= array[i] #寻找那个数
        res = []
        res.append(onlyOne)
        res.append((eor ^ onlyOne))
        return res

JavaScript版本:

function FindNumsAppearOnce(array)
{
    // write code here
    // return list, 比如[a,b],其中ab是出现一次的两个数字
        let res = [];
        let n = array.length;//求出数组的长度
        let eor = 0;//用来保存那两个只出现1次的数的异或值
        for(let i = 0; i < n; i ++)
        {
            eor ^= array[i];//将整个数组异或
        }
        /// eor = a ^ b
        /// eor != 0
        /// eor必然有一个位置上是1
        let rightOne = eor & (~eor + 1); /// 提取出最右的1
        let onlyOne = 0;//用来保存只出现1次的数的其中的那一个
        for(let i = 0; i < n; i ++)
        {
            if((array[i] & rightOne) != 0)
            {
                onlyOne ^= array[i];//寻找那个数
            }
        }
        res.push(onlyOne);
        res.push(eor ^ onlyOne);
        return res;
}
module.exports = {
    FindNumsAppearOnce : FindNumsAppearOnce
};