计蒜客 单独的数字(位运算)

本是古典 何须时尚 2024-02-17 22:14 27阅读 0赞

给定一个数组 A,除了一个数出现一次之外,其余数都出现三次。找出出现一次的数。

如:{1,2,1,2,1,2,7},找出 7。

你的算法只能是线性时间的复杂度,并且不能使用额外的空间哦~

输入格式

第一行输入一个数n(1≤n≤500),代表数组的长度。

接下来一行输入 n 个 int 范围内(−2147483648…2147483647)的整数,表示数组 A。保证输入的数组合法。

输出格式

输出一个整数,表示数组中只出现一次的数。

样例输入

4
0 0 0 5
样例输出

5

AC代码:

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<map>
  4. using namespace std;
  5. const int maxn=500+10;
  6. int a[maxn];
  7. int n;
  8. int main(){
  9. while(scanf("%d",&n)==1){
  10. map<int,int>mp;
  11. for(int i=0;i<n;i++){
  12. scanf("%d",&a[i]);
  13. mp[a[i]]++;
  14. }
  15. for(int i=0;i<n;i++){
  16. if(mp[a[i]]==1){
  17. printf("%d\n",a[i]);
  18. break;
  19. }
  20. }
  21. }
  22. return 0;
  23. }

方法二:位运算

由于除了一个特殊的数外,其他的数都有 3 个,使用二进制的位运算,既然其他每次数都出现3次,那么如果针对每一位求和并对3取余,那么那些出现3次的数字在这一位的和对3取余后肯定是0。如:

1: 0 0 0 1
2: 0 0 1 0
1: 0 0 0 1
2: 0 0 1 0
1: 0 0 0 1
2: 0 0 1 0
7: 0 1 1 1
─────────
 0 1 4 4

0 1 4 4 每位除以3取余 得 0 1 1 1 => 7

AC代码:

  1. #include<cstdio>
  2. #include<cstring>
  3. using namespace std;
  4. const int maxn=500+10;
  5. int sum[32];
  6. int n;
  7. int main(){
  8. while(scanf("%d",&n)==1){
  9. for(int i=0;i<32;i++){
  10. sum[i]=0;
  11. }
  12. for(int i=0;i<n;i++){
  13. int a;
  14. scanf("%d",&a);
  15. for(int j=0;j<32;j++){
  16. sum[j]+=a&1;
  17. sum[j]%=3;
  18. a=a>>1;
  19. }
  20. }
  21. int cnt=0;
  22. for(int i=0;i<32;i++){
  23. int t=sum[i]<<i;
  24. cnt+=t;
  25. }
  26. printf("%d\n",cnt);
  27. }
  28. return 0;
  29. }

发表评论

表情:
评论列表 (有 0 条评论,27人围观)

还没有评论,来说两句吧...

相关阅读

    相关 迷宫 (bfs)

    已知一个 n 行 m 列的上下左右四联通的迷宫,其中字符 'Y' 表示起点,字符 'C' 表示终点,在途中只有一个起点和终点,字符 '\' 表示可通过的收费站,每通过一次需要花

    相关 跳跃游戏(dfs)

    给定一个非负整数数组,假定你的初始位置为数组第一个下标。 数组中的每个元素代表你在那个位置能够跳跃的最大长度。 请确认你是否能够跳跃到数组的最后一个下标。 例如:A=\[

    相关 “救援” 问题

    救生船从大本营出发,营救若干屋顶上的人回到大本营,屋顶数目以及每个屋顶的坐标和人数都将由输入决定,求出所有人都到达大本营并登陆所用的时间。 在直角坐标系的原点是大本营,救生船

    相关 ---三值排序

    排序是一种很频繁的计算任务。一个实际的例子是,当我们给某项竞赛的优胜者按金银铜牌排序的时候。在这个任务中可能的值只有三种1,2和3。我们用交换的方法把他排成升序的。 写一个程

    相关 - 汉诺塔

    问题: ![1516087-20190501155629805-481143157.png][] 思路: 汉诺塔问题非常经典,不懂推荐去看B站正月点灯笼老师的对于汉诺塔的