找出奇数个数中唯一出现一次的数
来源:互联网 发布:单片机驱动无源蜂鸣器 编辑:程序博客网 时间:2024/06/04 20:11
问题描述
现在有一堆奇数个数字,只有一个出现了一次,其余都出现了偶数次,找出这个数。
解决思路
如果采用简单遍历的方法统计每一个出现的次数,然后输出次数为1的数,这样有点复杂,时间复杂度为O(n2)。
#include<iostream>using namespace std;typedef struct { int value; int count=1;}Num;int main() { int n; Num num[100]; int answer; cin >> n; while (n % 2 == 0) { cout << "请输入奇数:"; cin >> n; } for (int i = 0;i < n;i++) { int flag = 0; cin >> num[i].value; for (int j = 0;j < i;j++) { //循环遍历以前的数 if (num[j].value == num[i].value) { flag = 1; num[j].count++; } } if (flag) { //若存在相等,则本身也要count++; num[i].count++; } } for (int i = 0;i < n;i++) { //找出出现的一次的数 if (num[i].count == 1) { answer = num[i].value; break; } } cout << answer << endl;}
如何才能进一步降低时间复杂度呢,这里用到位运算异或的方法,利用数的二进制位解决问题,相同的数字异或的结果是全0二进制数,微观的说,所有偶数个的数的位的值出现偶数次,最后的异或的结果必为0,这样出现一次的数就会使这些位数出现的次数为奇数,所以最后异或的结果就是我们要找的数,时间复杂度为O(1).
异或:1与1、0与0异或为0,而1与0异或为1。
#include<iostream>using namespace std;int solve(int num[],int n) { //异或 int answer=num[0]; for (int i = 1;i < n;i++) { //循环每次都与结果异或 answer^=num[i]; } return answer;}int main() { int n; cin >> n; int num[100]; while (n % 2 == 0) { cout << "请输入奇数:"; cin >> n; } for (int i = 0;i < n;i++) { cin >> num[i]; } int answer = solve(num,n); cout << answer << endl; cin >> n;}
阅读全文
0 0
- 找出奇数个数中唯一出现一次的数
- woj1202-找出奇数个数中唯一单个的数
- 找出一堆数中出现唯一一次的数
- 在N个数中找出出现奇数次的数
- 找出数组中唯一出现一次的数
- 找出数组中出现一次的数
- Single Number II -- 找出数组中唯一出现一次的数,其它数都出现了三次
- 找出数组中唯一出现一次的两个数字
- 奇数个元素,数组元素成对出现,找出只出现一次的数
- 找出数组中只出现一次的2个数
- 找出数组中只出现一次的2个数
- 找出数组中只出现一次的2个数
- 找出数组中只出现一次的2个数
- 找出数组中唯一出现两次的数
- 寻找唯一出现奇数次的数
- 找出出现奇数次的数
- 如何找出数组中出现次数为奇数次的唯一元素
- 找出数组中两个只出现一次的数
- WebRTC 初探
- 我的第一篇博客
- Android下面打印进程函数调用堆栈(dump backtrace)的方法
- C++类内存分布 通过Visual studio 2013查看
- 在NT中直接访问物理内存
- 找出奇数个数中唯一出现一次的数
- 与位运算有关的算法题思路总结
- 一文看懂25个神经网络模型
- eclipse 工作空间的高效使用
- leetcode algorithm1 twoSum
- 实战DeviceIoControl 之七:在Windows 9X中读写磁盘扇区
- 学习淘淘商城第一百零四课(生成订单)
- mysql 创建用户 远程登录数据库
- 短信监听2