移位运算符解子集问题--用移位运算符转十进制为二进制
想直接看十进制转二进制的同学可以跳转:
目录
p.用移位运算符转十进制为二进制
子集是一个数学概念:如果集合A的任意一个元素都是集合B的元素,那么集合A称为集合B的子集。
--百度百科
现在给你一个数组,按任意顺序输出这个数组的子集(空集也算哟~)。
遇见这中题目最容易想的就是DFS:
1、从0开始设置数组的长度;
2、将数组长度固定,传入DFS函数,循环递归得出子集。
一般的写法很麻烦,小编今天整些花活,用移位运算符来写
关于移位运算符的详细介绍,我在这里就不多赘述了,大家在CSDN上一查便知。
众所周知:移位运算符只针对二进制数,例如:
3 的二进制数是 011 ,将它右移移位,即 3 >> 1; 得到 001 等于1,所以
3 >> 1 = 1;
p.用移位运算符转十进制为二进制
对于一个数组,根据这个数组的元素是否在当前子集的状态,我们可以定义为:
如果这个元素在子集当中,就这个元素的状态为1,否则为0,即对应于所有的子集,都有一个与数组长度相等的二进制串:如下表所示(图片来源于leetcode官方题解)
请大家仔细观察,假设数组为{1,2,3},长度为3,从0遍历到3,得到的数的二进制串为:
000
001
010
100
101
110
111
在长度上,这组二进制串的个数刚好等于长度为3的数组的子集个数,在元素内容上,按照上面所述的方法:每一个二进制串表示的数字都是原数组的子集,并且没有重复,例如:
110 表示数组{1,2},是原数组的子集;100表示数组{1},也是原数组的子集。由此看来:
这题的思路就非常简单了:
假设数组长度为n,for从0遍历到n, 再对应的求出每一个二进制串所表示的数字即可。
问题来了,我们得到的是0~n的整数,怎么获取对应的二进制串呢?或者说,怎么获取对应的二进制串所表达的信息--数字串呢?
移位运算符可以做到!
假设现在得到的数字是:3, 让 1 & 3, 结果等于1
再将 3 右移移位,得到1, 重复上面的操作,1 & 1, 得到 1
在将1 右移一位, 得到0, 1 & 0, 得到 0 ,
组合上面红色的数字,得到 011 ,恰好是 3 的二进制串。
总结规律:假设我们知道二进制串的长度k,和这个二进制串所表示的整数s,我们用while循环n次,保存每次得到的数字后将s右移一位,倒序即可得到这个整数所表示的二进制串。
上代码:
//子集
vector<vector<int>> subsets(vector<int>& nums) {vector<vector<int>>ans;int n = nums.size();for (int i = 0; i < pow(2,n); i++){vector<int>ret;int flag = n - 1;int k = i;while (flag >= 0){if (1 & k){ret.push_back(nums[flag]);}flag--;k = k >> 1;}ans.push_back(ret);}return ans;
}int main()
{vector<int>nums;for (int i = 0; i < 3; i++){int a = 0;cin >> a;nums.push_back(a);}vector<vector<int>>ans = subsets(nums);for (int i = 0; i < ans.size(); i++){for (int j = 0; j < ans[i].size(); j++){cout << ans[i][j] << " ";}cout << endl;}return 0;
}
希望和诸君共勉!
移位运算符解子集问题--用移位运算符转十进制为二进制相关推荐
- Java移位运算符详解实例——左移位运算符、带符号的右移位运算符
移位运算符也针对二进制的"位",它主要包括:左移位运算符(<<).右移位运算符(>>>).带符号的右移位运算符(>>). 1.左移运算符 ...
- mysql所支持的比较运算符_mysql比较运算符有哪些?Mysql比较运算符详解
比较运算符可用于比较数字和字符串.今天发一篇Mysql比较运算符详解,希望对初学者有所帮助,虽然现在流行NoSQL,但是MYSQL还是很有用的,数字作为浮点值进行比较,字符串以不区为例进行比较,=运算 ...
- 展开运算符解构赋值_解构式展开式搜索栏
展开运算符解构赋值 View demo 查看演示Download Source 下载源 Maybe you have noticed the little adjustments that we di ...
- 多段实例代码详解7大类Python运算符,建议收藏!
导读:本文主要介绍Python运算符.举个简单的例子:4+5=9,其中,4和5被称为操作数,+称为运算符.Python语言支持以下类型的运算符:算术运算符.比较(关系)运算符.赋值运算符.逻辑运算符. ...
- 【详解】位运算符:位逻辑运算符,位移运算符(<<左移,>>右移)
位运算符包括位逻辑运算符.位移运算符.最近做算法的时候经常用到,现在来总结下. 重点掌握的是 左移 << ,右移 >> . 1.位逻辑运算符 那么位逻辑运算符怎么计算的呢?先看 ...
- 增量C语言,详解C++中的增量运算符++和减量运算符--的用法
前缀增量和减量运算符:++ 和 -- 语法 ++ unary-expression –– unary-expression 备注 前缀递增运算符 (++) 向其操作数添加 1:此递增值是表达式的结果. ...
- python ** 运算符_Python从入门到放弃运算符(2)
摘要:上一篇Python从入门到放弃-运算符(1),讲了Python的运算符中的算术运算符.赋值运算符.比较(关系)运算符,这篇继续讲Python的运算符. 逻辑运算符 逻辑运算符是对真和假两种布尔值 ...
- swift:高级运算符(位运算符、溢出运算符、优先级和结合性、运算符重载函数)...
swift:高级运算符 http://www.cocoachina.com/ios/20140612/8794.html 除了基本操作符中所讲的运算符,Swift还有许多复杂的高级运算符,包括了C语和 ...
- c语言 正号运算符 作用,C语言中,哪些运算符具有左结合性,哪些具有右结合性,帮忙总结下,...
1级(左结合) () 圆括号:[]下标运算符:->指向结构体成员运算符:. 结构体成员运算符. 2级(右结合) !逻辑非运算符:~按位取反运算符:++前缀增量运算符:--前缀减量运算符:+正号运 ...
最新文章
- C++中vector的使用
- 我的Android进阶之旅------gt;Android APP终极瘦身指南
- 代码坏味道 - 耦合
- SAP上线前数据重置方式总结
- 使用 gitlab 进行代码管理
- 20应用统计考研复试要点(part9)--应用多元分析
- java面向对象小程序_java运用面向对象的思想实现计算器的小程序
- html语言对齐是什么意思,html – 对齐RTL语言的元素
- 网络流(最大流) HDU 1565 方格取数(1) HDU 1569 方格取数(2)
- 三大数据库数据库端口号及连接jdbc驱动下载
- VC++实现混合静态分裂视窗的方法
- 火狐html5播放器,可能用户已经发现你在火狐内建HTML5音视频播放器
- ASP编程实现各家快递公司订单状态查询
- 小团队如何提高工作效率
- 【ipone开发学习】-2、利用现有资源第二步 硬盘安装Snow LeopardXcode
- 爬取微信公众号cookie获取与token获取
- 爆肝1万字《c++入门综合》
- TWebLive基于TRTC和IM实现web群直播
- java adobe pdf转word_ADOBE READER把PDF转换成WORD教程
- 海洋环境保护具体内容
热门文章
- google云端硬盘colab
- 为什么一定要亲身经历了之后才能明白?
- c语言中mikado_蜜蜂如何使用mikado方法
- Python 保留两位小数几种方法
- 一位选择困难症及其强迫症患者使用喜马拉雅FM的Flash point!
- 【网络知识】mac组播地址和单播地址
- Android手机应用接口大全
- 【解决scikit_learn.libs/libgomp-d22c30c5.so.1.0.0:cannot allocate memory in static TLS block问题】
- 青龙脚本(顺丰速运,附脚本)
- Overriding和Overloaded的区别