一个奇数次

题目描述

输入一个长度为 n 的数组,考虑所有不同的数字,有且只有一个数字出现了奇数次。

比如对于 1 2 3 1 2 3 1 ,我们考虑所有不同的数字 1 2 3 ,有且只有 1 出现了奇数次( 3 次)

输出这个出现了奇数次的数字。

1≤n≤100000,1≤a[i]≤10^9

输入格式

第一行一个整数 n ,

接下来一行 n 个整数,表示输入的数字。

输出格式

一行一个数字,表示出现了奇数次的数字。

样例

【样例输入】

复制代码
7
1 2 3 1 2 3 1

【样例输出】

复制代码
1

一些想法

这道题用暴力求会爆,所以我们可以用简单位运算做这题。

首先介绍一下要用到的位运算:异或。

它的规则是:若参加运算的两个二进制位值相同则为0,否则为1。

由此可以得知,在这道题中,可以根据一个数异或自己等于 0 的性质,因为根据异或的规则:二进制位值相同则为0,否则为1。而自己与自己完全相等,自己的二进制也与自己的二进制完全相等,所以自己异或自己等于0。

而题目要求找出现次数为奇数的数。根据上面异或的性质我们可以推算出,出现次数为偶数次的数异或自己的和会等于 0 ,而出现次数为奇数次的数异或自己的和会等于本身。

所以我们可以把所有输入的数都异或在一起,出现了偶数次数的数会抵消掉等于 0,而出现了奇数次数的数会等于自己,最后会剩下出现了奇数次数的数,直接输出即可。

基本性质:因为异或运算既有自反性(自己异或自己为 0),与 0 运算性(a ^ 0 = a,任何数与 0 进行异或运算,结果还是该数本身)以及交换、结合律(顺序不影响结果)也适用于异或运算。那我们将所有数的异或和看做 0(偶数次数的数异或为 0)异或出现奇数个数的数,就等于出现奇数个数的数。

AC代码

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int a[1000005];
int main(){
	int n,sum=0;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		sum^=a[i];
	}
	cout<<sum;
	return 0;
} 
相关推荐
深邃-7 分钟前
【C语言】-数据在内存中的存储(1)
c语言·开发语言·数据结构·c++·算法
xiaoye-duck14 分钟前
《算法题讲解指南:优选算法-字符串》--61.最长公共前缀,62.最长回文子串,63.二进制求和,64.字符串相乘
c++·算法·字符串
chh56317 分钟前
从零开始学C++--类和对象
java·开发语言·c++·学习·算法
xyx-3v32 分钟前
C++构造函数、析构函数与拷贝控制深度解析
开发语言·c++
Larry_Yanan35 分钟前
Qt+OpenCV(一)环境搭建
开发语言·c++·qt·opencv·学习
草莓熊Lotso1 小时前
MySQL 事务管理全解:从 ACID 特性、隔离级别到 MVCC 底层原理
linux·运维·服务器·c语言·数据库·c++·mysql
paeamecium1 小时前
【PAT甲级真题】- Reversing Linked List (25)
数据结构·c++·算法·pat
TTTrees1 小时前
C++学习笔记(38):封装、继承、多态
c++
6Hzlia1 小时前
【Hot 100 刷题计划】 LeetCode 54. 螺旋矩阵 | C++ 模拟法题解
c++·leetcode·矩阵
梓䈑2 小时前
Gflags解剖课:从DEFINE宏到命令行解析的工程化实践
c++·gflags