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 ...
随机推荐
- WinRM和WinRS
1.6.2 新远程工具:WinRM和WinRS 2012-05-14 10:18 张杰良 译 清华大学出版社 字号:T | T 综合评级: 想读(18) 在读(5) 已读(0) 品书斋鉴(0) ...
- Tensorflow打造聊天机器人
Tensorflow聊天机器人 聊天机器人也叫做对话系统,是一个热门领域.微软.facebook.苹果.google.微信.slack都在上面做了大的投入,这是一波新的试图改变人和服务交流的创业浪潮. ...
- 极简Node教程-七天从小白变大神(一:你需要Express)
如果说用一句话来概括Node那就是:它开启了JavaScript服务器端语言. Node系列的文章并不会从一开始长篇概论的讲Node的历史,安装,以及其他很琐碎的事情.只会专门介绍关于Node或者准确 ...
- Monkey日志信息的11种Event percentages
我们查看官方文档,表里只给出了8种事件(可以看我上篇的翻译文档).但我们运行Monkey后,却发现有11种事件!最坑爹的是,在每种事件的百分比后面,他还不给注明是什么事件! 原来不同的Android ...
- 菜鸟之路——Linux基础::计算机网络基础,Linux常用系统命令,Linux用户与组权限
最近又重新安排了一下我的计划.准备跟着老男孩的教程继续学习,感觉这一套教程讲的很全面,很详细.比我上一套机器学习好的多了. 他的第一阶段是Python基础,第二阶段是高等数学基础,主要将机器学习和深度 ...
- Hadoop入门第四篇:手动搭建自己的hadoop小集群
前言 好几天没有更新了,本来是应该先写HDFS的相关内容,但是考虑到HDFS是我们后面所有学习的基础,而我只是简单的了解了一下而已,后面准备好好整理HDFS再写这块.所以大家在阅读这篇文章之前,请先了 ...
- pq
pq 题目描述 小q 的女朋友送给小q nn个整数.但是这些数太大了,小q 的女朋友拿不动,于是拜托小q把这些数减少一些. 小q 每次可以选择其中的两个x,yx,y (不能同时选择同一个数) 变成x− ...
- 团子最大家族(clannad)
团子最大家族(clannad) 题目描述 bx2k有许多五颜六色的萌萌哒团子.每个团子有一种颜色. 他决定将m个团子排成一排.为了美观,他要求任何相邻的两个团子不能有相同的颜色. 因为bx2k很懒,因 ...
- Write with Vim (1)
Write with Vim (1) 本文出自Svitter的blog 原文在之前的也曾发表 大约在一年前使用vim?这个也是个不确定的时间.具体什么时间使用Vim早已经忘记了. 现在用的还算顺手,但 ...
- 设置Animation 的播放位置
AnimationState.normalizedTime 官方文档的描述 Description The normalized time of the animation. A value of 1 ...