经典算法 | 给定一个有n个数的数组,里面每个数出现a次,有一个数出现b次,b小于a,求出这个数。

给定一个有n个数的数组,里面每个数出现a次,有一个数出现b次,b<a,求出这个数。

这一题可以使用暴力求解,但是这样的话需要统计每个数出现的次数,空间复杂度为o(n),这里要求空间复杂度为O(1)

这里可以使用二进制来解决

每个int型除了符号位有32位,因此我们可以统计这n个数的每一位的值,将这些值相加,对于那些出现了a次的数而言,全部数的某一位相加必定是a的倍数,对于那个出现了b次的数而言,将它的这一位和前面的结果相加, 假如得到的结果除以a余b,那么说明多出来的这个数这一位是1,假如余数是0,那么说明多出来的这个数的这一位为0

因此可以得到下面的代码

#include<iostream>

using namespace std;

int main()

{

        

         int num[] = { 1, 1, 2, 2, 1, 2, 459123123, 4, 4, 4 };

扫描二维码关注公众号,回复: 3335498 查看本文章

         int a = 3;

         int b = 2;

         int n = 10;

         int result = 0;

         int count;

         for (int i = 0; i <= 31; i++)

         {

                  count = 0;

                  for (int j = 0; j < n; j++)

                  {

                          count += ((num[j] >> i) & 1);

                  }

                  if (count % a != 0)

                  {

                          result += (1 << i);

                  }

         }

         cout << result;

         return 0;

}

猜你喜欢

转载自blog.csdn.net/u012737193/article/details/82829146
今日推荐