LeetCode137只出现一次的数字——位运算
题目
题目描述:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现三次。找出那个只出现一次的元素。
说明:你的算法应该具有线性时间的复杂度。你可以不使用额外的空间来实现吗?
思路
题目要求线性复杂度,一般的算法做不到,不难想到用位运算。但怎么进行位运算,比较难想到。
b = (b ^ x) & ~a;
a = (a ^ x) & ~b;
^ 相当于除去原有元素,添加新元素, a &~ b 相当于从a集合中除去b集合中的所有元素。
int len = nums.size();
for(int i =;i < len;++i)
{
b = (b ^ nums[i]) & ~a;
a = (a ^ nums[i]) & ~b;
}
出现一次的存在b中,第二次出现从b中清除同时会存在a中,第三次出现会从b中清除。最终出现一次的都存在b中,出现两次的都存在a中。
例如:[1,2,2,1,1,2,99]
| b={0} | {1} | {1,2} | {1} | {0} | {0} | {0} | {99} |
| a={0} | {0} | {0} | {2} |
{1,2} |
{2 | {0} | {0} |
代码
class Solution {
public:
int singleNumber(vector<int>& nums) {
int a = , b = ;
for (auto x : nums) {
a = (a ^ x) & ~b;
b = (b ^ x) & ~a;
}
return a;
}
};
static const auto __lamda = []() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
return nullptr;
}();
续:
朋友面试竟然遇到了,前面的算法很讲究技巧性,不通用,补充一个较通用的方法:
int数组,32位,用一个32位的int数组,每一位记录值在该位出现1的次数。
其余元素出现3次,最后加起来肯定 %3 = 0。剩下的就是只出现一次的。
int bits[]; int singleNumber(vector<int>& nums)
{
int res = ;
for(int i = ;i <;i++)
{
for(int j = ;j < nums.size();j++)
{
bits[i] += (nums[j]&);
nums[j] >>= ;
}
} for(int i = ;i < ;i++)
if(bits[i] % ) res += ( << i); return res;
}
参考链接:
1. https://leetcode-cn.com/problems/single-number-ii/comments/
2. https://www.cnblogs.com/fanguangdexiaoyuer/p/11585950.html
LeetCode137只出现一次的数字——位运算的更多相关文章
- 剑指offer-面试题56_2-数组中唯一只出现一次的数字-位运算
/* 题目: 数组中除一个数字只出现一次外,其余数字都出现3次. */ /* 思路: 位运算. */ #include<iostream> #include<cstring> ...
- 剑指offer-面试题56_1-数组中只出现一次的两个数字-位运算
/* 题目: 求数组A中只出现一次的数字,该数组中有2个数字a.b仅出现一次,其余均出现两次 */ /* 思路: 两个相同的数字异或为0. 遍历数组,得到数组中各数字异或后的结果x,结果x=a^b. ...
- leetcode137. 只出现一次的数字 II
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次.找出那个只出现了一次的元素.说明:你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗?示例 1:输入: [2,2 ...
- [Swift]LeetCode137. 只出现一次的数字 II | Single Number II
Given a non-empty array of integers, every element appears three times except for one, which appears ...
- LeetCode通关:求次数有妙招,位运算三连
分门别类刷算法,坚持,进步! 刷题路线参考: https://github.com/chefyuan/algorithm-base 大家好,我是刷题困难户老三,这一节我们来刷几道很有意思的求次数问题, ...
- Java位运算总结
关于位运算,以前也见过,搜过,当时会用了,过后就忘了,今天好好学习一遍,然后整理一下. Java中的位运算,涉及到计算机的二进制,位用bit表示,1Byte=8bit,根据各种基本数据类型占用的字节空 ...
- 九度OJ 1351:数组中只出现一次的数字 (位运算)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3098 解决:906 题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 输入: 每个 ...
- 九度OJ 1256:找出两个只出现了一次的数字 (位运算)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:568 解决:186 题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 输入: 输入的 ...
- 剑指Offer 数组中只出现一次的数字
题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 思路: 因为有2个数字只出现了一次,而其他的数字都是2次,可以通过异或运算,得到最后这2个只 ...
随机推荐
- 替换Android自带apk【转】
本文转载自:http://www.voidcn.com/article/p-gonowdjh-vz.html 安卓自带的app放在/system/app/下,当我们想要替换这些应用时可以参考如下步骤: ...
- Apache POI组件操作Excel,制作报表(三)
Apache POI组件操作Excel,制作报表(三) 博客分类: 探索实践 ExcelApache算法Office单元测试 上一篇介绍了POI组件操作Excel时如何对单元格和行进行设置, ...
- java对象序列化的理解
1.java中的序列化时transient变量(这个关键字的作用就是告知JAVA我不可以被序列化)和静态变量不会被序列 化(下面是一个测试的例子) (实体带versionUUID,便 ...
- UI: 网易新闻实现
#pragma mark-(AppDelegate.H文件)-------------------------------------------------------------------- ...
- ava Double: 四舍五入并设置小数点位数
public static void main(String[] args) { // 1. 先乘后四舍五入, 再除; double d = 62.31060027198647; double d2 ...
- 安装phpwind报错
在安装phpwind时,下面的报错提示是什么原因呢? 答:数据库密码应设置为空
- 3 Java对象的内存布局以及对象的访问定位
先来看看Java对象在内存中的布局 一 Java对象的内存布局 在HotSpot虚拟机中,对象在内存中的布局分为3个区域 对象头(Header) Mark Word(在32bit和64bit虚拟机 ...
- 版本控制系统Git
常用的版本控制系统有VSS.SVN.CVS等等,Git是最近几年使用得比较多的分布式版本控制系统,存在即合理,Git的出现总有它出现的理由,以前的版本控制系统肯定有一些不足的地方,所以才出现了Git. ...
- (5)css盒子模型(基础上)
CSS 盒子模型概述 ***什么是CSS的盒子模型呢?为什么叫它是盒子?先说说我们在网页设计中常听的属性名:内容(content).边框(border).内边距(padding).外边距(margin ...
- layui table 详细讲解
layui.use('table', function () { var table = layui.table; /*第一种原始写法*/ ...