只出现一次的数字


题目描述

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

说明

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


示例

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

示例 1

输入: 
3
2 2 1

输出: 
1

示例 2

输入: 
1 
4 1 2 1 2

输出: 
4

题解

数组中除了一个数字只出现了一次,其它数字都出现了两次。要求算法具有线性复杂度 O ( N ) {O(N)} 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;   
}

返回顶部

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值