北邮OJ 84. Single Number
2016-03-10 09:58
337 查看
84. Single Number
时间限制1000 ms内存限制 65536 KB
题目描述
Given an array with Nintegers where all elements appear three times except for one. Find out the one which appears only once.
输入格式
Several test cases are given, terminated by EOF.Each test case consists of two lines. The first line gives the length of arrayN(1≤N≤10 5 ) ,
and the other line describes the N
elements. All elements are ranged in [0,2 63 −1] .
输出格式
Output the answer for each test case, one per line.输入样例
4 1 1 1 3 10 1 2 3 1 2 3 1 2 3 4
输出样例
3 4
正文:
此类题目的描述多形如“在一堆正整数中,有一个数恰好出现了B次,而其他的数均出现了A次,一共有N个数,请求出那出现B次的数,数据保证有解”。
设题目输入为:
第一行3个正整数n,a,b( b<a ),第二行n个正整数,所有的数均在int范围之内。输出那个出现b次的数。
分析:
针对此类题目,我们在此给出一个通解——位统计法:本题中,所有数大小在int范围内,所以数字长度最长不超过10,我们开一个10*10的二维数组。用来统计,所有数字中出现在从第1位(个位)起到第10位(十亿位)每一位上0~9这10个数字每个数字出现的次数。
然后我们处理完之后,最后只需要从第10位(十亿位)开始到第1位(个位)依次检查0~9这10个数字出现的次数中,有没有不被a整除的即可,如果有,输出之,就可以得到你想要的那个出现了b次的数了。
#include<stdio.h> #define clr(a) memset(a,0,sizeof a)
int main(){ int i,j,cnt[20][20]={0},n; while(scanf("%d",&n)!=EOF){ clr(a); getchar(); for(i=0;i<n;i++){ char ch; j=0; while((ch=getchar())>47) cnt[j++][ch-48]++; } for(i=0;i<20;i++) for(j=0;j<20;j++) if(cnt[i][j]%3) printf("%c",j+'0'); printf("\n"); } return 0; }
相关文章推荐
- Vim如何保存需要root权限的文件
- 使用Eclipse生成generated serial version ID的时候,Eclipse弹出出错信息
- 关于request.getServletPort()获取访问地址的说明
- 第一次上机实验2
- mysql中 show table status 获取表信息
- sublime的安装和相关插件的安装
- string拼接和StringBuilder性能对比
- Android基础之Process
- php伪静态
- mysql小结
- ASP.NET学习资料
- Python&Eclipse环境搭建
- ES6中非常实用的新特性介绍
- Java实现从字符串中找出数字字符串的方法小结
- javascript与jQuery
- html5拖放
- Android开发之使用事务
- Linux用户(User)和用户组(Group)管理命令
- java中jdk与jre的关系以及环境变量配置时Java_Home\Path\ClassPath各代表什么意思
- 3.C#中的多重委托