剑指 Offer II 070. 排序数组中只出现一次的数字

这篇博客介绍了如何利用异或运算解决寻找有序数组中唯一出现一次的数字的算法。通过讲解异或的基本概念,包括符号表示、运算规则和性质,解释了为什么异或能有效地找到这个单身狗数字。提供的代码示例展示了如何在O(n)的时间复杂度内找到答案。
摘要由CSDN通过智能技术生成

找出那只单身狗:

正文开始@Assassin

1. 题目描述:

给定一个只包含整数的有序数组nums ,每个元素都会出现两次,唯有一个数只会出现一次,请找出这个唯一的数字。

  • 示例 1:
    输入: nums = [1,1,2,3,3,4,4,8,8]
    输出: 2

  • 示例 2:
    输入: nums = [3,3,7,7,10,11,11]
    输出: 10

在这里插入图片描述

来源:力扣(LeetCode)
点我跳转到leetcode!!

2. 思路:

这道题用异或的思路是最优解~~

这里先简单介绍一下异或的概念:

2.1 异或的基本概念:

2.1.1 符号表示:

异或是一种二进制的位运算,符号以 XOR^ 表示。也就是本质上是按二进制位异或。

2.1.2 运算规则:

按照二进制位相同为0,不同为1,即:

1 ^ 1 = 0
0 ^ 0 = 0
1 ^ 0 = 1

由运算规则可知,任何数与0异或,都会等于其本身,即 0 ^ A = A。
任何数与其本身异或,都会等于0,即 A ^ A = 0。

2.1.3 异或的性质:
(1)交换律: A ^ B = B ^ A

(2)结合律: ( A ^ B ) ^ C = A ^ ( B ^ C )

(3)自反性: A ^ B ^ B = A (由结合律可推: A ^ B ^ B = A ^ ( B ^ B ) = A ^ 0 = A)

话不多说,我们干正事儿~~

3. 题解:

提示: 使用位操作符异或可以快速找出单独的数字,两个相同数字异或为零,零与任何数字异或为本身,这样便可以达到排除偶数次重复的操作。

int singleNonDuplicate(int* nums, int numsSize){    
    int ret=0;//保存结果
    for(int i=0;i<numsSize;++i)
    {
        ret^=nums[i];//依次遍历异或数组中的每一个数,最终剩下的便是单身狗
    }
    return ret;
}

在这里插入图片描述

时间复杂度为O(n)

see you next blog~~

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宁海没有七号公园

谢谢你%%%

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值