计蒜客 单独的数字问题

原创 2018年04月16日 23:16:25

问题描述

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

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

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

输入格式

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

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

输出格式

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

样例输入

4
0 0 0 5

样例输出

5

解题思路

首先这题很容易联想到另外一题,也是找出单独的数,不同的是,另外一题中其他数都是出现2次,所以使用异或运算后,对于二进制每一位,相同的数就被消除了,得到了单独的数字。但是,这题中其他数字是出现3次的。不过我们还是可以从前面的解法得到启发,使用二进制的位运算,既然其他每次数都出现3次,那么如果针对每一位求和并对3取余,那么那些出现3次的数字在这一位的和对3取余后肯定是0,其实就是单独的那个数在这一位上的结果。所以,针对32位的整数,我们只要求出二进制的每一位的和对3取余,就是单独的数的二进制,再转化成10进制,就是我们需要的答案。

作者:破东风CAFEBABY
链接:https://www.jianshu.com/p/8c454ade848e

图示

这里写图片描述

C++代码示例

#include <iostream>
#include <malloc.h>
#include <string>
#include <cstdio>
#include <cstdlib>

using namespace std;

int main()
{
    int sum[32],n,a;
    //初始化数组列表,使得数组中每个元素都先分配一个固定的值。
    for(int i=0;i<32;i++)
    {
        sum[i] = 0;
    }
    cin>>n;
    for(int i= 0;i<n;i++)//n表示后面将要循环和迭代的次数
    {
        cin>>a;
        for(int j=0;j<32;j++)
        {
            sum[j] += ((a >> j) & 1);
            sum[j] %= 3;
        }
    }
    int ans = 0;
    for(int i=0;i<32;i++)
    {
        ans += sum[i]<<i;
        cout<<ans<<endl;
    }
    printf("%d\n",ans);
    return 0;
}

C++另外代码示例:

#include <iostream>
#include <cstdio>
#include <cstdlib>

using namespace std;

int main()
{
    int n, x, y, z, t, a;
    while (scanf("%d", &n) != EOF)
    {
        x = y = 0;
        z = ~0;
        for (int i = 0; i < n; ++i)
        {
            scanf("%d", &a);
            t = (a&x)|(~a&y);
            x = (a&z)|(~a&x);
            z = (a&y)|(~a&z);
            y = t;
        }
        printf("%d\n", x);
    }
}

设计到C++中的一个非常重要的知识点,那就是位运算。
其中包括双目运算: “&”(按位与)、“|”(按位或)、“^”(按位异或)、“<<”(左移运算)、”>>”(右移运算)
单目运算:”~”(按位取反)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37592397/article/details/79968357

Java - 计蒜客 - 单独的数字

给定一个数组,除了一个数出现1次之外,其余数都出现3次。找出出现一次的数。 如:{1, 2, 1, 2, 1, 2, 7}, 找出7. 格式:    第一行输入一个数n,代表数组的长度,接下来一...
  • qq_34594236
  • qq_34594236
  • 2016-06-03 15:25:32
  • 697

java计蒜客单独的数字试题

import java.util.Scanner; public class Main {     public static void main(String[] args) {     ...
  • microopithecus
  • microopithecus
  • 2017-12-22 09:08:16
  • 106

计蒜客 -- 单独的数字

给定一个数组 A,除了一个数出现一次之外,其余数都出现三次。找出出现一次的数。如:{1,2,1,2,1,2,7},找出 7。你的算法只能是线性时间的复杂度,并且不能使用额外的空间哦~输入格式第一行输入...
  • hunyxv
  • hunyxv
  • 2017-04-06 17:35:41
  • 1231

计蒜客————单独的数字(二)

一个整型数组中有一个元素只出现一次,其它元素都出现两次。求出只出现一次的元素。 要求: 线性时间复杂度,不能使用额外空间。 聪明的你能搞定吗? 格式: 第一行输入数字n,代表有n个数...
  • lose__way
  • lose__way
  • 2017-06-01 16:40:03
  • 247

[计蒜客] 单独的数字

Trapping Rain Water
  • lydyangliu
  • lydyangliu
  • 2015-01-03 19:20:39
  • 1877

计蒜客第15题---单独的数字

给定一个数组,除了一个数出现1次之外,其余数都出现3次。找出出现一次的数。 如:{1, 2, 1, 2, 1, 2, 7}, 找出7. 格式:    第一行输入一个数n,代表数组的长度,接下来一行输入...
  • dandelion1314
  • dandelion1314
  • 2015-07-21 19:05:04
  • 1143

【计蒜客系列】挑战难题115:单独的数字(二)

题目来源:计蒜客 一个整型数组中有一个元素只出现一次,其它元素都出现两次。求出只出现一次的元素。 要求: 线性时间复杂度,不能使用额外空间。 聪明的你能搞定吗? 格式: 第一行输入数字n,代表有n...
  • z9550695
  • z9550695
  • 2015-09-24 16:48:34
  • 466

计蒜客 单独的数字 位运算总结

a>>j&1 把a转化成二进制之后第j个位置的值 >>运算是整体右移动 &1运算取出二进制的最后一位 所以a>>j&1  如果我们要取数,要用&1取,但是&1是取最后一位,我们需要移动a,把想要去的第...
  • Little_boy_z
  • Little_boy_z
  • 2017-11-20 18:24:40
  • 78

计蒜客 单独的数字

单独的数字 给定一个数组 AAA,除了一个数出现一次之外,其余数都出现三次。找出出现一次的数。 如:{1,2,1,2,1,2,7}\{1, 2, 1, 2, 1, 2, 7\}{1,2,1,2...
  • weixin_37282581
  • weixin_37282581
  • 2017-10-06 08:45:29
  • 461

计蒜客题目 单独的数字(二)

一个整型数组中有一个元素只出现一次,其它元素都出现两次。求出只出现一次的元素。要求:线性时间复杂度,不能使用额外空间。聪明的你能搞定吗?格式:第一行输入数字n,代表有n个数,根据题意,很明显n是奇数,...
  • sinat_41679123
  • sinat_41679123
  • 2018-03-01 16:06:51
  • 10
收藏助手
不良信息举报
您举报文章:计蒜客 单独的数字问题
举报原因:
原因补充:

(最多只允许输入30个字)