ACM随笔----- 计蒜客 单独的数字
2016-06-14 23:33
253 查看
解决本题 可以采用2种方法
第一 如下。
第二 采用 位运算的方法
单独的数字
给定一个数组,除了一个数出现1次之外,其余数都出现3次。找出出现一次的数。
如:{1, 2, 1, 2, 1, 2, 7}, 找出7.
格式:
第一行输入一个数n,代表数组的长度,接下来一行输入数组A
,(输入的数组必须满足问题描述的要求),最后输出只出现一次的数。
要求:
你的算法只能是线性时间的复杂度,并且不能使用额外的空间哦~
第二种方法
#include<iostream>
using namespace std;
int main(){
int n;
cin >> n;
int b[32] = {};
int a;
while(n--){
cin >> a;
for(int i = 0; i < 32; ++i){
if(a & (1 << i)){
b[i] = (b[i] + 1) % 3;
}
}
}
int res = 0;
for(int i = 0; i < 32; ++i){
res += b[i] *(1 << i);
}
cout << res << endl;
}
第一 如下。
第二 采用 位运算的方法
单独的数字
给定一个数组,除了一个数出现1次之外,其余数都出现3次。找出出现一次的数。
如:{1, 2, 1, 2, 1, 2, 7}, 找出7.
格式:
第一行输入一个数n,代表数组的长度,接下来一行输入数组A
,(输入的数组必须满足问题描述的要求),最后输出只出现一次的数。
要求:
你的算法只能是线性时间的复杂度,并且不能使用额外的空间哦~
样例输入
4 0 0 0 5
样例输出
5
1 #include"iostream" 2 #define MAX 100000 3 using namespace std; 4 5 int main() 6 { 7 int n,tag,a[MAX]; 8 scanf("%d",&n); 9 for(int i=0;i<n;i++) 10 { 11 scanf("%d",&a[i]); 12 } 13 14 for(int i=0;i<n;i++) 15 { 16 tag=0; 17 for(int j=0;j<n;j++) 18 if(a[i]==a[j]) 19 tag++; 20 if(tag==1) 21 printf("%d",a[i]); 22 } 23 2425 }
第二种方法
#include<iostream>
using namespace std;
int main(){
int n;
cin >> n;
int b[32] = {};
int a;
while(n--){
cin >> a;
for(int i = 0; i < 32; ++i){
if(a & (1 << i)){
b[i] = (b[i] + 1) % 3;
}
}
}
int res = 0;
for(int i = 0; i < 32; ++i){
res += b[i] *(1 << i);
}
cout << res << endl;
}
相关文章推荐
- OPENCV中的Sobel函数
- 如何判断鼠标进入元素的方向
- angularJs 自定义服务 provide 与 factory 的区别
- C++ 引用本质的详解
- [51NOD1181]质数中的质数(质数筛法)(欧拉筛)
- SVN冲突错误解决办法
- 土地利用/覆被变化(LUCC)定义理解
- MenuDrawer的简单使用
- HDU 2896 (AC自动机)
- pl/sql连接oracle配置
- Spark Streaming揭秘 Day26 JobGenerator源码图解
- 最好的学习时光是四年前,其次是现在
- TextView的一些应用(Textview 自定义字体、显示多种颜色、添加阴影)
- 机器学习之K-近邻算法
- 【BZOJ-4008】亚瑟王 概率与期望 + DP
- DOCKER windows安装
- Qt安卓JNI交互之(1) C++注册函数给JAVA调用
- android——数据存储SQLite
- linux 版本
- js api 微信支付 chooseWXPay:fail