只出现一次的数字

题目描述

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

说明

算法应具有线性时间复杂度,且不使用额外空间来实现。

示例

说明:

  • 输入
    • 第一行输入数组个数
    • 第二行输入数组元素
  • 输出
    • 打印输出所找到的只出现一次的数字

示例 1 :

输入: 3
      2 2 1
输出: 1

示例 2 :

输入: 1 
      4 1 2 1 2
输出: 4

题解

数组中除了一个数字只出现了一次,其它数字都出现了两次。要求算法具有线性复杂度 \({O(N)}\) ,且不使用额外空间。那么只遍历了一遍数组,最终结果保存在原数组的某个位置。

0 ^ a = aa ^ a = 0 可以得出,若对数组中任意两个相同的数字按位异或结果则为 0 ,最后将剩下唯一的出现了一次的数字。

如果数组中除了某个元素出现奇数次以外,其余每个元素均出现偶数次,那么也可以使用此种算法求出出现奇数次的数字。

代码

#include <iostream>
#include <vector>

using namespace std;

int singleNumber(vector<int>& nums) 
{
    int len = nums.size();
    for (int i = 1; i < len; i++)
    {
        nums[0] ^= nums[i];
    }
    return nums[0];
}

int main()
{
    vector<int> nums;
    int n = 0, num = 0;
    cin >> n;
    while (n--)
    {
        cin >> num;
        nums.push_back(num);
    }
    cout << singleNumber(nums) << endl;
    return 0;   
}

返回顶部

posted @ 2019-05-21 22:32  民间程序员  阅读(64)  评论(0编辑  收藏  举报