Leetcode Single Number II (面试题推荐)
2024-08-30 08:41:32
还记得《剑指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就是我们要的答案
}
};
最新文章
- Java POI 解析word文档
- 求android ble 解决方案!
- Windows下MySQL 5.6安装及配置详细图解
- C#创建桌面快捷方式 和 开机启动
- bzoj 1877: [SDOI2009]晨跑
- JQuery源码分析(六)
- JDBC常用代码
- mysql INNODB_TRX 事务表
- nodejs hello world (调用文件执行没反应)
- VSTO 学习笔记(六)在 Excel 2010中使用RDLC报表
- Hibernate原理
- 201521123084 《Java程序设计》第6周学习总结
- 使用C#编写SqlHelper类
- JDBC详解系列(三)之建立连接(DriverManager.getConnection)
- MT2018笔试题之计算数字位数
- BZOJ2434: [Noi2011]阿狸的打字机(AC自动机 树状数组)
- Hive窗口函数
- 067 Flume协作框架
- Python3 中使用sys.argv详解
- Windows:删除图标缓存