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 位运算总结&拾遗 最近补充了一些位运算的知识,深感位运算的博大精深,此文作为这个系列的总结篇,在此回顾下所学的位运算知识和应用,同时也补充下前文中没有提到的一些位运算知识 ...
随机推荐
- JavaScript Patterns 5.8 Chaining Pattern
Chaining Pattern - Call methods on an object one after the other without assigning the return values ...
- Sqlite学习笔记(四)&&SQLite-WAL原理
Sqlite学习笔记(三)&&WAL性能测试中列出了几种典型场景下WAL的性能数据,了解到WAL确实有性能优势,这篇文章将会详细分析WAL的原理,做到知其然,更要知其所以然. WAL是 ...
- 2、HDFS和Yarn的基础学习笔记
日志 --排错 .log:通过log4j记录的,记录大部分应用程序的日志信息 .out:记录标准输出和标准错误日志,少量记录 hdfs 常用shell -ls -put < ...
- C# 读取在存储过程多结果集
--SQL Server 测试环境搭建: Create database Test; go USE [Test] GO if OBJECT_ID('Tab','U') is not null drop ...
- 数据分页处理系列之三:Neo4j图数据分页处理
首先简单介绍下Neo4j,Neo4j是一个高性能的NOSQL图形数据库,它将结构化数据存储在网络上而不是表中,它是一个嵌入式的.基于磁盘的.具备完全的事务特性的Java持久化引擎,但是它将结构化数 ...
- pl/sql developer——instant-client 简单配置
instant-client(数据库即时客户端) 官方说明:即时客户端在一个单独的针对 Instant Client 的 OTN 开发和分发许可下提供,它允许大多数许可下载.重新分发和部署到生产环境中 ...
- my_shell
#include<stdio.h> #include<unistd.h> #include<string.h> #include<stdlib.h> # ...
- X264库直接压缩BITMAP格式数据
最近帮朋友看了下X264压缩视频,主要参考了雷霄骅(leixiaohua1020)的专栏的开源代码: http://blog.csdn.net/leixiaohua1020/article/detai ...
- node命令
- ATM模拟程序
一个很简单的ATM模拟程序 #include <stdio.h> void chaxun(int a3){ int b; b=a3; printf("您的余额为:%d\n&quo ...