列表

详情


BM52. 数组中只出现一次的两个数字

描述

一个整型数组里除了两个数字只出现一次,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。

数据范围:数组长度 ,数组中每个数的大小
要求:空间复杂度 ,时间复杂度

提示:输出时按非降序排列。

示例1

输入:

[1,4,1,6]

输出:

[4,6]

说明:

返回的结果中较小的数排在前面

示例2

输入:

[1,2,3,3,2,9]

输出:

[1,9]

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 2ms, 内存消耗: 300KB, 提交时间: 2021-09-13

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param array int整型vector 
     * @return int整型vector
     */
    vector<int> FindNumsAppearOnce(vector<int>& array) {
        // write code here
        int n = array.size();
        map<int, int> mp;
        vector<int> res;
        for (int i=0; i<n; i++)
            mp[array[i]]++;
        for (int i=0; i<n; i++)
        {
            if (mp[array[i]] == 1)
                res.push_back(array[i]);
        }
        sort(res.begin(),res.end());
        return res;
    }
};

C++ 解法, 执行用时: 2ms, 内存消耗: 304KB, 提交时间: 2021-09-08

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param array int整型vector 
     * @return int整型vector
     */
    vector<int> FindNumsAppearOnce(vector<int>& array) {
        // write code here
        vector<int>res;
        int n=array.size();
        int s=0;
        for(int i=0;i<n;i++)
        {
            s^=array[i];
        }
        int mask=lowbit(s);
        int a=0,b;
        for(int i=0;i<n;i++)
        {
            if(mask&array[i])a^=array[i];
        }
        b=s^a;
        res.push_back(a);
        res.push_back(b);
        if(res[0]>res[1])swap(res[0],res[1]);
        return res;
    }
    
    int lowbit(int s)
    {
        return s&-s;
    }
};

C++ 解法, 执行用时: 2ms, 内存消耗: 304KB, 提交时间: 2021-09-04

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param array int整型vector 
     * @return int整型vector
     */
    vector<int> FindNumsAppearOnce(vector<int>& array) {
        // write code here
        vector<int> vec;
        if (array.size() == 0) return vec;
        map<int, int> m;
        sort(array.begin(),array.end());
        int target = 0;
        for (int i = 0; i < array.size(); ++i)
        {
            m[array[i]]++;
        }
        for (int i = 0; i < array.size(); ++i)
        {
            if (m[array[i]] == 1)
                vec.push_back(array[i]);
        }
        return vec;
    }
};

C++ 解法, 执行用时: 2ms, 内存消耗: 304KB, 提交时间: 2021-07-23

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param array int整型vector 
     * @return int整型vector
     */
//     vector<int> FindNumsAppearOnce(vector<int>& array) {
//         vector<int> ret;
//         int N = array.size();
//         if (N < 1) return ret;
//         if (N < 2)
//         {
//             ret.push_back(array[0]);
//             return ret;
//         }
        
//         map<int, int> mp;
//         int i;
//         for (i = 0; i != N; i++)
//         {
//             mp[array[i]]++;
//         }
        
//         for (i = 0; i != N; i++)
//         {
//             if (mp[array[i]] == 1)
//                 ret.push_back(array[i]);
//         }
//         return ret;
//     }
    
    vector<int> FindNumsAppearOnce(vector<int>& array) {
        vector<int> ret;
        int len = array.size();
        if(len == 0) return ret;
        
        int xorRes = 0;
        for(int i = 0; i < len; i ++){
            xorRes ^= array[i];
        }
        int a = xorRes & (-xorRes + 1);
        int b = 0;
        for(int i =0; i < len; i ++){
          if((a & array[i]) != 0){
             b ^= array[i];
          }
        }
        a = b ^ xorRes;
        ret.push_back(a);
        ret.push_back(b);
        return ret;
    }
};

C++ 解法, 执行用时: 2ms, 内存消耗: 320KB, 提交时间: 2022-03-13

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param array int整型vector 
     * @return int整型vector
     */
    vector<int> FindNumsAppearOnce(vector<int>& array) {
        // write code here
        if(array.empty()) return {};
        vector<int> vout;
        const int sz = array.size();
        sort(array.begin(), array.end());
        for(int i = 0; i < sz;){
            if(i+1 < sz && array[i] == array[i+1]) i+=2;
            else{
                vout.emplace_back(array[i]);
                ++i;
            }
        }
        return vout;
    }
};

上一题