找出那只单身狗:
正文开始@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)