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

【Leetcode】136.只出现一次的数字

作者头像
Leetcode名企之路
发布2019-07-09 20:04:13
4580
发布2019-07-09 20:04:13
举报
文章被收录于专栏:Leetcode名企之路Leetcode名企之路

题目

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

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:

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

示例 2:

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

题解

这道题要求时间复杂度是o(n),空间复杂度是o(1)。难点在于空间复杂度,所以最开始我们很容易想到的hash的方式肯定是不行的。那就要找数组本身有没有什么性质了,本题考查的是异或运算。

先复习一下异或运算,同为0,异为1:

0 ^ 0=0,1 ^ 0=1,0 ^ 1=1,1 ^ 1=0。

同时异或具有如下性质:

  • A ^ B = B ^ A。异或满足交换律。
  • A ^ 0= A。任何数与0的异或不改变本身的值。

假设题目中描述的数组为 [A1,A1,A2,A2,…,An,An,Ax]。其中,Ax 只出现一次,其余的元素都出现两次。对该数组中的所有元素进行异或运算可得:

[A1,A1,A2,A2,…,An,An,Ax] 的乱序序列异或

= A1 ^ A1 ^ A2 ^ A2… ^ An ^ An ^ Ax

= (A1 ^ A1) ^ (A2 ^ A2)… ^ (An ^ An) ^ Ax

= 0 ^ 0… ^ Ax

= Ax

因此,只需要遍历数组中的所有元素,依次进行两两异或操作就可以找出只出现一次的元素。

代码语言:javascript
复制
class Solution {
    public int singleNumber(int[] nums) {
        int ret = nums[0];
        for (int i = 1; i < nums.length; ++i) {
            ret ^= nums[i];
        }
        return ret;
    }
}

热门阅读

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Leetcode名企之路 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目
  • 题解
  • 热门阅读
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档