前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >leetcode-137-Single Number II-第一种解法

leetcode-137-Single Number II-第一种解法

作者头像
chenjx85
发布2018-05-21 18:27:57
1.4K0
发布2018-05-21 18:27:57
举报

题目描述:

Given an array of integers, every element appears three times except for one, which appears exactly once. Find that single one.

Note: Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?

要完成的函数:

int singleNumber(vector<int>& s) 

说明:

1、这道题和上一道题一样,要求时间复杂度是线性的,要求不能使用空间复杂度是O(1)的。但不同的是这次除了一个数只出现一次,其余所有数都出现了三次。我们又要怎么解决这道题呢?

2、同样直接上讨论区代码,再次膜拜大神。大神使用了一种统计的方法,不过不是我等平常思维的统计每个数出现了几次,而是开了一个长度为32的数组,统计每个二进制位出现了几次,最后对3取模(如果是出现了K次就对K取模),取模完哪一位不是3的整倍数,就说明只出现了一次的那个数,在这个位上为1,最终可以求出最后的结果。以下举例说明。

举例说明:

c++中存储一个int型整数,都是32位的空间,我们也开32位的数组。但以下为了表示简便,我们只用最后的4位,就足够了。

假定我们的array of integers为[1,2,2,1,1,2,4,4,5,4],写成二进制位就是:

1:0001

2:0010

2:0010

1:0001

1:0001

2:0010

4:0100

4:0100

5:0101

4:0100

T:0434

R:0101

(T表示total,合计,每一列的和。R表示对3取模完之后的结果)

然后对T中的数值,每一位都对3取模,可以看到:出现了3的整数倍次的,取模完结果都是0;出现了非3的整数倍次的,即只出现了一次的那个数,取模完结果都为1,说明只出现一次的那个数,在当前这个位有出现过,最后也可以求出这个值。

不得不赞叹二进制位的神奇,可以发挥出“记录”的效果。这要是三进制位,就不能这样子处理了。二进制位为1,表示出现过,在这种“1个只出现1次,其余都出现了n次”的题目中,可以发挥出奇效。

不过似乎不是O(n)的时间复杂度?

代码:

代码语言:javascript
复制
int singleNumber(vector<int>& s) 
{
  vector<int> t(32);//开辟一个32位的数组 
   int i,j,n;
   for (i = 0; i < s.size(); ++i)
   {
    n = s[i];
       for (j = 31; j >= 0; --j)
       {
      t[j]+=(n&1);//统计当前这个数的二进制位情况 
          n >>= 1;
          if (!n)
        break;
       }
   }
   int result= 0;//表示最后的取模完的结果 
   for (j = 31; j >= 0; --j)
   {
       n = t[j] % 3;
       if (n)
           result+=(1<<(31-j));
   }
   return res;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-04-08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目描述:
  • 要完成的函数:
  • 说明:
  • 举例说明:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档