Single Number II - LeetCode
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?
思路:位运算神题!
这一题我们将所有的数都看作是二进制表示形式。
因为所有的数都出现了三次,除了我们要求的数出现了一次。
那么先考虑如果所有数都出现了三次是什么情况。
将所有数都看作二进制表示形式,然后对于所有的数,我们计数二进制每一位上1出现的次数。
因为所有数都出现了3次,因此每一位上的1也应该是3的倍数。
现在,再添加一个只出现了一次的数。
那么很容易发现,这个数所有二进制为1的位计数都加了1,于是这些位的计数就不再是3的倍数了!
整理下思路就是,这些二进制位1的计数,每到3就归零,则综合最后为1的位就是这个数了。
要计数二进制每一位1出现的次数,我们可以用数组,但是这里用两个int变量就够了。因为int本身就是一个32位变量,我们让其自身的每一位负责计数它对应那一位上1出现的次数。
因为我们对于1的计数到3后就归零,因此两位二进制就可以表示:00、01、10、00。。。。
然后我们将两个计数int变量命名为ones和twos,分别存储这个二进制计数的最低位和高位。
而他们的变化流程如下:
twos ones
0 0
0 1
1 0
0 0
先看ones的规律:ones与nums[i]异或,二进制位初始为0,与1异或1次后为1,异或2次后为0,异或3次后为1。但是根据上表,第三次时ones仍要为0,注意观察twos在第一次和第三次时的值,可以发现ones = (ones ^ nums[i]) & ~twos就能满足这个条件。
twos的规律类似, 为twos = (twos ^ nums[i]) & ~ones。这里,因为twos要在ones之后计算才能实现表中的效果。
最后所有值都异或完成后,所有出现3次的位都变为0,不是3次的则为1次。ones就是所求的数,而twos等于0。
class Solution {
public:
int singleNumber(vector<int>& nums) {
int ones = , twos = ;
for (int num : nums)
{
ones = (ones ^ num) & ~twos;
twos = (twos ^ num) & ~ones;
}
return ones;
}
};
Single Number II - LeetCode的更多相关文章
- Single Number II leetcode java
问题描述: Given an array of integers, every element appears three times except for one. Find that single ...
- Leetcode 137 Single Number II 仅出现一次的数字
原题地址https://leetcode.com/problems/single-number-ii/ 题目描述Given an array of integers, every element ap ...
- LeetCode 137. Single Number II(只出现一次的数字 II)
LeetCode 137. Single Number II(只出现一次的数字 II)
- LeetCode(137) Single Number II
题目 Given an array of integers, every element appears three times except for one. Find that single on ...
- 【LeetCode】137. Single Number II 解题报告(Python)
[LeetCode]137. Single Number II 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode.com/problems/single- ...
- 【leetcode】Single Number && Single Number II(ORZ 位运算)
题目描述: Single Number Given an array of integers, every element appears twice except for one. Find tha ...
- 【题解】【位操作】【Leetcode】Single Number II
Given an array of integers, every element appears three times except for one. Find that single one. ...
- leetcode 之 Single Number II
问题来源:Single Number II 问题描述:给定一个整数数组,除了一个整数出现一次之外,其余的每一个整数均出现三次,请找出这个出现一次的整数. 大家可能很熟悉另一个题目(Single Num ...
- leetcode 136. Single Number 、 137. Single Number II 、 260. Single Number III(剑指offer40 数组中只出现一次的数字)
136. Single Number 除了一个数字,其他数字都出现了两遍. 用亦或解决,亦或的特点:1.相同的数结果为0,不同的数结果为1 2.与自己亦或为0,与0亦或为原来的数 class Solu ...
随机推荐
- Kali 中文家目录改英文目录
中文版Kali装好之后,家目录会中文显示,不便操作 root@kali:~# ls -l drwxr-xr-x root root .0K 7月 : 公共 drwxr-xr-x root root . ...
- mysql查询当天的数据
mysql查询当天的数据 贴代码: #两个时间都使用to_days()函数 select * from reple where to_days(create_time) = to_days(NOW() ...
- loj2537 「PKUWC 2018」Minimax
pkusc 快到了--做点题涨涨 rp. 初见时 yy 了一个类似于归并的东西,\(O(n^2)\),50 分. 50 分 yy 做法 对于一个点,枚举他能到达的权值(假设这个权值在左子树,在右子树是 ...
- luogu2023 [AHOI2009]维护序列
线段树加乘懒标记裸题. #include <iostream> #include <cstdio> using namespace std; typedef long long ...
- hdu 4176
Class Statistics Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- eclipse删除svn下载的文件后如何恢复
Team右键-->与资源库同步-->覆盖/更新
- JDBC 学习笔记(十一)—— JDBC 的事务支持
1. 事务 在关系型数据库中,有一个很重要的概念,叫做事务(Transaction).它具有 ACID 四个特性: A(Atomicity):原子性,一个事务是一个不可分割的工作单位,事务中包括的诸操 ...
- Hadoop入门第五篇:Hive简介以及部署
标签(空格分隔): Hadoop Hive hwi 1.Hive简介 之前我一直在Maxcompute上进行大数据开发,所以对数仓这块还算比较了解,在接受Hive的时候基本上没什么大的障碍.所以, ...
- OtherStream
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.DataInputStream; import ...
- ionic2 使用slides制作滑动效果的类型选择栏
类似的效果如下图: 1. 生成一个component ionic g component MySlide 2. 在my-slide.html中添加代码: <ion-slides class=&q ...