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 ...
随机推荐
- Linuxshell编程
重点回顾: 1.由于核心的内存中是受保护的区块,因此我们必须要透过“shell”将我们输入的指令与Kernel沟通,好让Kernel可以控制硬件来正确无误的工作 2.学习shell的原因主要有:文字接 ...
- mybatis是如何防止sql注入?
sql注入发生的时间,sql注入发生的阶段在sql预编译阶段,当编译完成的sql不会产生sql注入 采用jdbc操作数据时候 String sql = "update ft_proposal ...
- C++模板编程-模板基础重点
模板基础 1.模板参数自动推导,如果是已知的参数类型与个数,这调用模板时可以不写类型. Cout<<max<int>(1,3);可以写为Cout<<max(1,3) ...
- MongoDB快速入门学习笔记4 MongoDB的文档查询操作
先把student删除,再重新插入数据 > db.student.drop() true > db.student.insert([{ "_id" : 1, " ...
- alert(1) to win部分解题
XSS在线习题分析 (https://alf.nu/alert1) 1. Warmup function escape(s) { return '<script>console.log(& ...
- python - 接口自动化测试 - TestRegister - 注册接口测试用例
# -*- coding:utf-8 -*- ''' @project: ApiAutoTest @author: Jimmy @file: test_register.py @ide: PyChar ...
- 爬虫:Scrapy3 - Items
Item 对象是种简单的容器,保存了爬取到得数据.其提供了类似于词典(dictionary-like)的API以及用于声明可用字段的简单语法. 声明Item import scrapy class P ...
- 在数组中寻找出现次数大于N/K的数
给定一个int[]数组,给定一个整数k,打印所有出现次数大于N/k的数,没有的话,给出提示信息. === 核心思想:一次在数组中删除K个不同的数,不停的删除,直到剩下的数的种类不足K就停止删除,那么如 ...
- 【转】UGUI之用脚本动态的改变Button的背景图片 和 颜色
http://blog.csdn.net/u014771617/article/details/45102701 public Button button;void Start(){ColorBloc ...
- Mybatis通过接口实现一对一及一对多的查询
实现一对一是采用association方法: <resultMap type="testId" id="users"> <associatio ...