GEEK编程练习— —寻找单个数
来源:互联网 发布:淘宝销售量怎么算 编辑:程序博客网 时间:2024/04/29 15:50
题目1
给定一组整数,其中除了一个整数只出现一次外,其他每个整数都是成双出现。找到这个只出现一次的整数。
要求:
1、线性时间复杂度
2、不开辟额外内存空间
输入
0 0 1 3 2 4 1 4 2
输出
3
分析1
异或操作可以实现偶数次清零的功能。
代码1
#include <iostream>#include <vector>using namespace std;int main(){ vector<int> nums; int tmp; while (cin >> tmp) nums.push_back(tmp); int x = 0; for (auto i : nums) { x ^= i; } cout << x << endl; return 0;}
题目2
给定一组整数,其中除了一个整数只出现一次外,其他每个整数都出现3次。找到这个只出现一次的整数。
要求:
1、线性时间复杂度
2、不开辟额外内存空间
输入
0 0 0 1 1 2 1 2 3 4 4 2 4
输出
3
分析2
其实,与题目1一样,考察的是位运算。
输出的是整数,可以创建一个数组ncount[sizeof(int)],ncount[i]表示第i位出现1的次数。如果ncount[i]是3的整数倍,就忽略。否则就把改位取出来组成最终答案。
代码2
#include <iostream>#include <vector>using namespace std;int main(){ vector<int> nums; int tmp; while (cin >> tmp) nums.push_back(tmp); const int W = sizeof(int) * 8; int ncount[W]{}; for (int i = 0; i < nums.size(); ++i) { for (int j = 0; j < W; ++j) { ncount[j] += (nums[i] >> j) & 1; ncount[j] %= 3; } } int result = 0; for (int i = 0; i < W; i++) { result += (ncount[i] << i); } cout << result << endl; return 0;}
0 0
- GEEK编程练习— —寻找单个数
- GEEK编程练习— —两数求和
- GEEK编程练习— —三数求和
- GEEK编程练习— —四数求和
- GEEK编程练习— —2的次方数
- GEEK编程练习— —3的次方数
- GEEK编程练习— —4的次方数
- GEEK编程练习— —螺旋矩阵
- GEEK编程练习— —zigzag矩阵
- GEEK编程练习— —字符替换
- GEEK编程练习— —格雷码
- GEEK编程练习— —回文字符串
- GEEK编程练习— —字符串匹配
- GEEK编程练习— —通配符匹配
- GEEK编程练习— —有效数字
- GEEK编程练习— —罗马数字问题
- GEEK编程练习— —计数问题
- GEEK编程练习— —回文构词法
- present动画效果
- 2015-2016 ACM-ICPC, NEERC, Moscow Subregional Contest(K. King's Rout)(拓扑排序)
- Canvas参考
- Maven的生命周期阶段
- 《编程之美——微软技术面试心得》一摞烙饼的排序初体验
- GEEK编程练习— —寻找单个数
- MapReduce中job参数及设置map和reduce的个数
- centos 6.5下搭建DNS服务器
- hdoj-1233-还是畅通工程
- Linux 设备总线驱动模型
- 死锁和产生的原因
- 了解R软件
- 虚拟机vm下ubuntu server 14.04的网络配置和SSH连接问题
- iOS之MD5加密