题目描述:

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)的时间复杂度?

代码:

int singleNumber(vector<int>& s)
{
  vector<int> t();//开辟一个32位的数组
int i,j,n;
for (i = ; i < s.size(); ++i)
{
    n = s[i];
for (j = ; j >= ; --j)
{
      t[j]+=(n&);//统计当前这个数的二进制位情况
n >>= ;
if (!n)
        break;
}
}
int result= ;//表示最后的取模完的结果
for (j = ; j >= ; --j)
{
n = t[j] % ;
if (n)
result+=(<<(-j));
}
return res;
}

leetcode-137-Single Number II-第一种解法的更多相关文章

  1. LeetCode 137. Single Number II(只出现一次的数字 II)

    LeetCode 137. Single Number II(只出现一次的数字 II)

  2. Leetcode 137 Single Number II 仅出现一次的数字

    原题地址https://leetcode.com/problems/single-number-ii/ 题目描述Given an array of integers, every element ap ...

  3. [LeetCode] 137. Single Number II 单独数 II

    Given a non-empty array of integers, every element appears three times except for one, which appears ...

  4. LeetCode 137 Single Number II(仅仅出现一次的数字 II)(*)

    翻译 给定一个整型数组,除了某个元素外其余的均出现了三次. 找出这个元素. 备注: 你的算法应该是线性时间复杂度. 你能够不用额外的空间来实现它吗? 原文 Given an array of inte ...

  5. [LeetCode] 137. Single Number II 单独的数字之二

    Given a non-empty array of integers, every element appears three times except for one, which appears ...

  6. 详解LeetCode 137. Single Number II

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

  7. leetcode 137. Single Number II ----- java

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

  8. Java [Leetcode 137]Single Number II

    题目描述: Given an array of integers, every element appears three times except for one. Find that single ...

  9. LeetCode 137 Single Number II 数组中除了一个数外,其他的数都出现了三次,找出这个只出现一次的数

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

  10. Java for LeetCode 137 Single Number II

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

随机推荐

  1. loadrunner12-错误 -26366: 找不到 web_reg_find 的“Text=19728.00”

    转:检查点(web_reg_find函数详解) LR检查点 设置检查点的目的不只是为了验证我们的脚本没有错误,而更重要的是一个规范问题,如何使得测试结果更具有说服力,因此建议所有的测试脚本中都添加检查 ...

  2. 转载 MYSQL性能优化的最佳20+条经验

    转自:https://coolshell.cn/articles/1846.html 今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才 ...

  3. code1068 乌龟棋

    暴力显然不行,所以考虑dp 记f[i][j][k][l]为使用i张1,j张2,k张3,l张4所得到的最大分数. 对于每个f[i][j][k][l],都可以由i-1张1,j张2,k张3,l张4所得到, ...

  4. VMware 桥接模式 复制物理网络连接状态的作用

    参考: https://docs.vmware.com/cn/VMware-Workstation-Pro/15.0/com.vmware.ws.using.doc/GUID-826323AD-D01 ...

  5. 轻松搭建持续集成工具jenkins

    1.Jenkins介绍1)什么是持续集成随着软件开发复杂度的不断提高,团队开发成员间如何更好地协同工作以确保软件开发的质量已经慢慢成为开发过程中不可回避的问题.尤其是近些年来,敏捷(Agile) 在软 ...

  6. es-文档版本号,操作类型,分片选择

    一.版本号: 在es中每个文档都有一个版本号,默认情况下,版本号都是随着每次对该文档的修改或者删除自增的,当然你也可以自己指定.有了这个文档号,我们可以像mysql 乐观锁一样,用来进行控制字我们文档 ...

  7. java修饰符 protect public protected

    1.private修饰词,表示成员是私有的,只有自身可以访问: 2.protected,表示受保护权限,体现在继承,即子类可以访问父类受保护成员(子类是可以访问父类的带protected修饰符的成员的 ...

  8. SQL的Join语法

    对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚.Codin ...

  9. SOAP协议初级指南 (三)

    独立元素 在SOAP中, 一个独立元素表示至少被一个多引用存取元素引用的类型的实例.所有的独立元素用soap:id属性作标记,而且这个属性的值在整个SOAP envelope中必须是唯一的.独立的元素 ...

  10. SOAP协议初级指南 (一)

    SOAP(Simple Object Access Protocal) 技术有助于实现大量异构程序和平台之间的互操作性,从而使存在的应用能够被广泛的用户所访问.SOAP是把成熟的基于HTTP的WEB技 ...