题目来源于力扣——136. 只出现一次的数字 - 力扣(LeetCode) (leetcode-cn.com)
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:输入: [4,1,2,1,2]
输出: 4
这个题目大家第一个想到的方法可能就是暴力遍历数组法,但是题目是希望我们不创建额外的空间。有一个很骚的方法就是位运算。
首先我们要知道位运算的几个性质
交换律:a ^ b ^ c <=> a ^ c ^ b
任何数于0异或为任何数 0 ^ n => n
相同的数异或为0: n ^ n => 0
就拿上面的数组 [4,1,2,1,2]来举例
我们可以穿件一个变量,并赋初值为0,先让数组第一个元素4与0异或,结果还是4,再让4与后面的元素进行异或既可,每次异或的结果存入一个变量
我们可以把上面的过程写成一个循环
代码如下:
#include<stdio.h>
int diverse(int arr[10], int sz)
{
int i = 0;
int result = 0;
for (i = 0; i < sz; i++)
{
result = result ^ arr[i];
}
return result;
}
int main()
{
int arr[10] = { 4,4,3,3,6,1,6};
int sz = sizeof(arr) / sizeof(arr[0]);
int ret=diverse(arr, sz);
printf("%d", ret);
}