leetcode - 位运算题目汇总(上)
最近在看位运算的知识,十分感叹于位运算的博大精深,正好leetcode有 Bit Manipulation 的专题,正好拿来练练手。
Subsets
给出一个由不同的数字组成的数组,枚举它的子数组(子集)。
这道题我之前用递归解过,而且效率还不错(beat 83.33%),解法如下不加详述了:
/**
* @param {number[]} nums
* @return {number[][]}
*/
var ans, res, len;
function dfs(index, nums) {
ans.push(res.concat());
for (var i = index; i < len; i++) {
res.push(nums[i]);
dfs(i + 1, nums);
res.pop();
}
}
var subsets = function(nums) {
nums.sort(function(a, b) {
return a - b;
});
ans = [],
res = [],
len = nums.length;
dfs(0, nums);
return ans;
};
如果用位运算解,这是一道经典的枚举子集。
比如我们有数组[1, 2, 3]
,还是要用到标志位的概念,全集为1 1 1
,全集表示都取,它的子集有1 0 1
、 1 1 0
、 1 0 0
等等,我们通过枚举子集,然后再通过子集获取原来数组的元素即可。
比如子集 1 0 1
,我们可以依次获取最右边的1,然后根据获取的1的大小判断数组元素的index位置从而获取数组,之后把该1置为0即可。
/**
* @param {number[]} nums
* @return {number[][]}
*/
var subsets = function(nums) {
nums.sort(function(a, b) {
return a - b;
});
var all = (1 << nums.length) - 1
, ans = [];
// 枚举子集
for (i = all; i; i = (i - 1) & all) {
var tmp = i
, res = [];
while (tmp) {
var rightMostOne = tmp & (-tmp)
, index = Math.log(rightMostOne) / Math.log(2);
res.push(nums[index]);
tmp = tmp & (tmp - 1);
}
ans.push(res);
}
// 子集的枚举没有0,所以要special insert
ans.push([]);
return ans;
};
Power of Two
判断一个数是不是2的幂。如果一个数是2的幂,那么该数与上该数-1为0。我们以8举例:
1 0 0 0
0 1 1 1
很明显,上面两数做与运算的结果是0。但是有个特殊的情况是,0 & (0 - 1) === 0
,所以我们还得判断该数为正。
/**
* @param {number} n
* @return {boolean}
*/
var isPowerOfTwo = function(n) {
return (!(n & (n - 1)) && n > 0);
};
这里加强下,如果知道某数是2的幂,求解这个指数值。即Math.pow(2, x) = n
,求x的值。
也很简单,用个log的换底公式(其实没有涉及位运算):
return Math.log(n) / Math.IN2;
Missing Number
给出一个0~n组成的数组[0, 1, 2, 3 ... n]
,从中随即去掉一个数字,给你新的数组,求解被去掉的数字。比如给你[0, 1, 3]
,返回2
。
这题涉及^
运算的性质:
// if
a ^ b = c;
// then
a ^ c = b;
b ^ c = a;
解法也就呼之欲出了。还是假设数组[0, 1, 3]
,我们可以知道n为3(等于数组长度),从而可以计算出0 ^ 1 ^ 2 ^ 3
的值,我们把它赋值给c;然后我们计算所给数组的元素的异或值,赋值给a,假设被舍弃的元素为b,我们可以得到如下等式:
a ^ b = c;
根据前边所讲:
b = a ^ c;
完整代码:
/**
* @param {number} n
* @return {boolean}
*/
/**
* @param {number[]} nums
* @return {number}
*/
var missingNumber = function(nums) {
var a = nums.reduce(function(pre, item) {
return pre ^ item;
});
var b = nums.reduce(function(pre, item, index) {
return pre ^ index;
}, nums.length);
return a ^ b;
};
leetcode - 位运算题目汇总(上)的更多相关文章
- leetcode - 位运算题目汇总(下)
接上文leetcode - 位运算题目汇总(上),继续来切leetcode中Bit Manipulation下的题目. Bitwise AND of Numbers Range 给出一个范围,[m, ...
- BitMap - leetcode [位运算]
136. Single Number 因为A XOR A = 0,且XOR运算是可交换的,于是,对于实例{2,1,4,5,2,4,1}就会有这样的结果: (2^1^4^5^2^4^1) => ( ...
- All LeetCode Questions List 题目汇总
All LeetCode Questions List(Part of Answers, still updating) 题目汇总及部分答案(持续更新中) Leetcode problems clas ...
- 78 leetCode 位运算解法
按照自己的理解题目,数组内所有的组合:假如[1,2,3,4]看成1111到0000里面的排列组合,取位运算. vector<vector > subsets(vector&nums ...
- leetcode.位运算.136只出现一次的元素-Java
1. 具体题目 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 说明:你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? 示例 1 ...
- leetcode top 100 题目汇总
首先表达我对leetcode网站的感谢,与高校的OJ系统相比,leetcode上面的题目更贴近工作的需要,而且支持的语言广泛.对于一些比较困难的题目,可以从讨论区中学习别人的思路,这一点很方便. 经过 ...
- leetcode 位运算异或
1. 只出现一次的数字(136) 异或的性质总结: 相异为1,相同为0: a ^ a = 0; 0 ^ a = a; 如果 a ^ b = c 成立,那么a ^ c = b 与 b ^ c = a 均 ...
- JavaScript 位运算总结&拾遗
最近补充了一些位运算的知识,深感位运算的博大精深,此文作为这个系列的总结篇,在此回顾下所学的位运算知识和应用,同时也补充下前文中没有提到的一些位运算知识. 把一个数变为大于等于该数的最小的2的幂 一个 ...
- 位运算总结&拾遗
JavaScript 位运算总结&拾遗 最近补充了一些位运算的知识,深感位运算的博大精深,此文作为这个系列的总结篇,在此回顾下所学的位运算知识和应用,同时也补充下前文中没有提到的一些位运算知识 ...
随机推荐
- SQL 扩展事件
在本篇,我通过使用新建“Session ”对话框来创建新的扩展事件会话.定义一个自己的扩展事件,动作和谓词,并且发布一个以收集事件数据为目的的会话. 首先从UI开始 在SQLServer2008R2以 ...
- XAML中的特殊符号几空白字符处理
阅读目录 介绍 详细 处理 Demo下载 介绍 XAML标记语言是基于xml的,所以很多xml中的特殊符号在XAML也是需要处理的. 详细 (取自msdn) 字符 Entity 注释 &(“a ...
- 烂泥:使用nginx利用虚拟主机搭建WordPress博客
本文由秀依林枫提供友情赞助,首发于烂泥行天下. 最近开始打算学习nginx web服务器,既然是学习还是以实用为目的的.我们在此以搭建WordPress博客为例. 搭建WordPress博客,我们需要 ...
- proteus 查找 仿真元件 中英文对照 [持续更新]
CRYSTAL 晶振 CAP 电容 RES 电阻 LED 灯 DIODE 二极管 POWER 电源 GND 接地 SPEAKER 扬声器 AT89C51 51 CPU芯片 三极管 PNP N ...
- sql查询最大的见多了,查询第二的呢???
问题: 数据库中人表有三个属性,用户(编号,姓名,身高),查询出该身高排名第二的高度. 建表语句 create table users ( id ,) primary key, name ), he ...
- Sql server2012连接Sql server 2008时出现的问题:已成功与服务器建立连接,但在登陆过程中发生错误。(provider:SSL Provider,error:0-接收到的消息异常,或格式不正确。)
以前连接是正常的,就这两天连不上了.(没有耐心的直接看末尾解决办法) 错误消息如下: 1.尝试读取或写入受保护的内存.这通常指示其他内存已损坏.(System.Data) 2.已成功与服务器建立连接, ...
- NOIP2009 提高组T3 机器翻译 解题报告-S.B.S
题目背景 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章. 题目描述 这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换.对于每个英文单词,软件会先 ...
- 【CSS】理解CSS
CSS(Cascading Style Sheet,层叠样式表),及其精巧且富有表达力,开发者可以用最为高效的方式高度掌控网页内容的表示. 1. 盒模型 CSS中的一个基本概念是盒模型(box mod ...
- Vijos1392拼拼图的小衫[背包DP|二维信息DP]
背景 小杉的幻想来到了经典日剧<死亡拼图>的场景里……被歹徒威胁,他正在寻找拼图(-.-干嘛幻想这么郁闷的场景……). 突然广播又响了起来,歹徒竟然又有了新的指示. 小杉身为新一代的汤浅, ...
- using关键字的用法
1.using 关键字可以用来导命名空间,与java中的import类似. 2.using关键字可以用来释放资源,并且被释放的资源代码是非托管代码. 既然可以释放非托管代码,那么什么是非托管代码? 我 ...