前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >只出现一次的数字

只出现一次的数字

作者头像
狼啸风云
发布2023-12-19 10:06:32
1120
发布2023-12-19 10:06:32
举报

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

你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。

示例 1 :

代码语言:javascript
复制
输入:nums = [2,2,1]
输出:1

示例 2 :

代码语言:javascript
复制
输入:nums = [4,1,2,1,2]
输出:4

示例 3 :

代码语言:javascript
复制
输入:nums = [1]
输出:1

如果不考虑时间复杂度和空间复杂度的限制,这道题有很多种解法,可能的解法有如下几种。

使用集合存储数字。遍历数组中的每个数字,如果集合中没有该数字,则将该数字加入集合,如果集合中已经有该数字,则将该数字从集合中删除,最后剩下的数字就是只出现一次的数字。

使用哈希表存储每个数字和该数字出现的次数。遍历数组即可得到每个数字出现的次数,并更新哈希表,最后遍历哈希表,得到只出现一次的数字。

使用集合存储数组中出现的所有数字,并计算数组中的元素之和。由于集合保证元素无重复,因此计算集合中的所有元素之和的两倍,即为每个元素出现两次的情况下的元素之和。由于数组中只有一个元素出现一次,其余元素都出现两次,因此用集合中的元素之和的两倍减去数组中的元素之和,剩下的数就是数组中只出现一次的数字。

上述三种解法都需要额外使用

O(n)
O(n)

的空间,其中

n
n

是数组长度。

如何才能做到线性时间复杂度和常数空间复杂度呢?

答案是使用位运算。对于这道题,可使用异或运算

\oplus
\oplus

。异或运算有以下三个性质。

任何数和

0
0

做异或运算,结果仍然是原来的数,即

a \oplus 0=a
a \oplus 0=a

。 任何数和其自身做异或运算,结果是

0
0

,即

a \oplus a=0
a \oplus a=0

。 异或运算满足交换律和结合律,即

a \oplus b \oplus a=b \oplus a \oplus a=b \oplus (a \oplus a)=b \oplus0=b
a \oplus b \oplus a=b \oplus a \oplus a=b \oplus (a \oplus a)=b \oplus0=b

假设数组中有

2m+1
2m+1

个数,其中有

m
m

个数各出现两次,一个数出现一次。令

a_{1}
a_{1}

a_{2}
a_{2}

\ldots
\ldots

a_{m}
a_{m}

为出现两次的

m
m

个数,

a_{m+1}
a_{m+1}

为出现一次的数。根据性质 3,数组中的全部元素的异或运算结果总是可以写成如下形式:

(a_{1} \oplus a_{1}) \oplus (a_{2} \oplus a_{2}) \oplus \cdots \oplus (a_{m} \oplus a_{m}) \oplus a_{m+1}
(a_{1} \oplus a_{1}) \oplus (a_{2} \oplus a_{2}) \oplus \cdots \oplus (a_{m} \oplus a_{m}) \oplus a_{m+1}

根据性质 2 和性质 1,上式可化简和计算得到如下结果:

0 \oplus 0 \oplus \cdots \oplus 0 \oplus a_{m+1}=a_{m+1}
0 \oplus 0 \oplus \cdots \oplus 0 \oplus a_{m+1}=a_{m+1}

因此,数组中的全部元素的异或运算结果即为数组中只出现一次的数字。

代码语言:javascript
复制
class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int ret = 0;
        for (auto e: nums) ret ^= e;
        return ret;
    }
};

复杂度分析

时间复杂度:

O(n)
O(n)

,其中

n
n

是数组长度。只需要对数组遍历一次。

空间复杂度:

O(1)
O(1)

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-12-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档