还记得《剑指offer》和《编程之美》等书上多次出现的找一个数组中仅仅出现一次的数那个题吗?

leetcode也有这道题 链接here  相信大家都知道用异或在O(n)的时间复杂度内求出的方法,这里不再赘述。

以下就是上题的升级版

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

Note:

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

给你一个整数数组。每一个元素出现了三次。但仅仅有一个元素出现了一次,让你找出这个数。要求线性的时间复杂度,不使用额外空间。

这样就不能使用异或的方法了。把全部元素以后得到的就是全部元素的异或值了,对我们没有不论什么帮助。

这个问题依然使用位运算来解决,只是更加复杂。

我们用三个变量one two three,分别存储二进制未分别出现一次 两次 三次的位。

class Solution {
public:
int singleNumber(int A[], int n) {
int one = 0, two = 0, three = 0;
for(int i = 0; i < n; i++)
{
three = two & A[i]; //出现三次的位肯定是由出现两次的得到的
two = two | ones & A[i]; //出现两次的肯定是出现一次的得到的,只是还有原有的所以要或
one = one | A[i]; //计算出现一次的位
two = two & ~three; //去掉二进制中出现三次的位
ones = one & ~three; //去掉二进制中出现三次的位</span>
}
return one; //终于twos three都为0。one就是我们要的答案
}
};

最新文章

  1. Java POI 解析word文档
  2. 求android ble 解决方案!
  3. Windows下MySQL 5.6安装及配置详细图解
  4. C#创建桌面快捷方式 和 开机启动
  5. bzoj 1877: [SDOI2009]晨跑
  6. JQuery源码分析(六)
  7. JDBC常用代码
  8. mysql INNODB_TRX 事务表
  9. nodejs hello world (调用文件执行没反应)
  10. VSTO 学习笔记(六)在 Excel 2010中使用RDLC报表
  11. Hibernate原理
  12. 201521123084 《Java程序设计》第6周学习总结
  13. 使用C#编写SqlHelper类
  14. JDBC详解系列(三)之建立连接(DriverManager.getConnection)
  15. MT2018笔试题之计算数字位数
  16. BZOJ2434: [Noi2011]阿狸的打字机(AC自动机 树状数组)
  17. Hive窗口函数
  18. 067 Flume协作框架
  19. Python3 中使用sys.argv详解
  20. Windows:删除图标缓存

热门文章

  1. UVa-1585-得分
  2. Linux 命令学习(1): head和tail
  3. 特殊权限和facl
  4. CSS3---box-shadow设置
  5. python基础知识04-散列类型运算优先级和逻辑运算
  6. 《算法导论》— Chapter 6 堆排序
  7. POJ 1905 Expanding Rods (求直杆弯曲拱起的高度)(二分法,相交弦定理)
  8. JSP默认选中下拉框的某一项
  9. URAL 2040 Palindromes and Super Abilities 2
  10. PTA 05-树8 File Transfer (25分)