位运算(Bit Manipulation)在算法中的应用
最近刷LettCode,遇到几个没思路的算法题,都是关于位运算的
# 136 Single Number
Given a non-empty array of integers, every element appears twice except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
Example 1:
Input: [2,2,1]
Output: 1
Example 2:
Input: [4,1,2,1,2]
Output: 4
找出成对数数组中的那个单身狗(成天吃狗粮干什么)
- O(n^2)思路
先将数组进行排序,然后每次比较相邻的两个数且前进2个,出现不相等则输出第一个数;
- O(nlogn)思路
改进排序算法,采用快排
- 最终解决思路O(n)
迭代一次数组通过位运算,最后得出结果即数组中的单身数。
原理:
0 xor any = any;1 xor any = ~any;any xor any = any
异或运算的feature使得再出现两个相同的数时,异或结果会变成0,而其中不成双的数最后相当于与0异或得以留存下来
代码:
class Solution {
public:
int singleNumber(vector<int>& nums) {
int ans=;
for(int e : nums){
ans ^= e;
}
return ans;
}
};
# 371 Sum of Two Integers
Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -.
Example 1:
Input: a = 1, b = 2
Output: 3
Example 2:
Input: a = -2, b = 3
Output: 1
不使用+,-运算符进行两数的相加,这题第一时间还真没思路
原理:
- 两数在二进制下相加,不考虑进位的情况下,如果某位上分别是1,0则该位结果为1;若都是1则结果是0;都是0也是0;这情况和异或一致,这样我们将两数异或就得到了未进位下的两数和。
- 而发生进位则是两数对应位上都是1的情况,这时候我们通过按位与操作,得到需要进位的位置,然后进行左移就是每个位需要加上的进位。
- 将未进位的数之和 同 发生的进位相加(注意这里又相当于两数相加),就得到了结果。
- 同时上一步的又会产生新的进位,我们需循环到进位为零的情况
注意:C++中的负数的左移操作最后会变为最小的负整数而不是0,所以需要对进位数进行截取 => carry = caryy & 0x7FFFFFFF (整型长32位)
代码:
class Solution {
public:
int getSum(int a, int b) {
int carry;
while(b){
carry = a & b & 0x7FFFFFFF;
a = a ^ b;
b = carry << ;
}
return a;
}
};
位运算(Bit Manipulation)在算法中的应用的更多相关文章
- 算法与数据结构基础 - 位运算(Bit Manipulation)
位运算基础 说到与(&).或(|).非(~).异或(^).位移等位运算,就得说到位运算的各种奇淫巧技,下面分运算符说明. 1. 与(&) 计算式 a&b,a.b各位中同为 1 ...
- Java中的位运算及简单的算法应用介绍
众所周知,计算机底层是二进制.而java作为一门计算机编程语言,也对二进制的位运算提供了完整的支持. 在java中,int是32位的,也就是说可以用来实现32位的位运算.方便起见,我们一般用16进制对 ...
- 【LeetCode】位运算 bit manipulation(共32题)
[78]Subsets 给了一个 distinct 的数组,返回它所有的子集. Example: Input: nums = [,,] Output: [ [], [], [], [,,], [,], ...
- LeetCode编程训练 - 位运算(Bit Manipulation)
位运算基础 说到与(&).或(|).非(~).异或(^).位移等位运算,就得说到位运算的各种奇淫巧技,下面分运算符说明. 1. 与(&) 计算式 a&b,a.b各位中同为 1 ...
- 位运算 进制转化 STL中bitset用法
2017-08-17 16:27:29 writer:pprp /* 题目名称:输入十进制以二进制显示 程序说明:同上 作者:pprp 备注:无 日期:2017/8/17 */ #include &l ...
- 位运算在状态压缩DP中的应用
一.判断一个数字X的i位是不是1 方法: << (i-)) & x > ) 原理: 1左移(i-1)位,相当于制造了一个就i位上是1其他位都是0的一个二进制数.将这个数 ...
- Java中的二进制及基本的位运算
Java中的二进制及基本的位运算 二进制是计算技术中广泛采用的一种数制.二进制数据是用0和1两个数码来表示的数.它的基数为2,进位规则是"逢二进一",借位规则是"借一当二 ...
- 基于DP+位运算的RMQ算法
来源:http://blog.csdn.net/y990041769/article/details/38405063 RMQ算法,是一个快速求区间最值的离线算法,预处理时间复杂度O(n*log(n) ...
- Java 位运算2-LeetCode 201 Bitwise AND of Numbers Range
在Java位运算总结-leetcode题目博文中总结了Java提供的按位运算操作符,今天又碰到LeetCode中一道按位操作的题目 Given a range [m, n] where 0 <= ...
随机推荐
- 为什么要实现Serializable
工作中我们经常在进行持久化操作和返回数据时都会使用到javabean来统一封装参数,方便操作,一般我们也都会实现Serializable接口,那么问题来了,首先:为什么要进行序列化:其次:每个实体be ...
- 资料整理:基于node push server实现push notification
chat example based on ionic/ socket.io/ redis https://github.com/jbavari/ionic-socket.io-redis-chat ...
- cloudera-scm-server启动时出现Caused by: javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: Could not open connection问题解决方法(图文详解)
问题现象 查看 [root@cmbigdata1 cloudera-scm-server]# pwd /var/log/cloudera-scm-server [root@cmbigdata1 clo ...
- 更新jdk后 Light Table无法找到新版本jdk的bin目录
原来是lein构建工具中保存了原来jdk版本记录,就是这个profiles文件 原来jdk1.7.0_17 我现在改成如下图jdk1.7.0_40 问题解决
- k8s architecture
总体架构 对应的源码结构: https://docker-k8s-lab.readthedocs.io/en/latest/kubernetes/stepbystep.html
- java 如何下载jar包
随着maven工具的使用,我们已经不再需要辛苦的找jar包,也不需要再买会员去下载jar包,但是还有一些同学,不知道怎么下载jar包,下面我给大家介绍一下,如何潇洒的找到自己想要的jar包. 首先,访 ...
- Java ConcurrentModificationException异常原因和解决方法(转)
摘自:http://www.cnblogs.com/dolphin0520/p/3933551.html#undefined 在前面一篇文章中提到,对Vector.ArrayList在迭代的时候如果同 ...
- net core 发布到服务器的方式
---恢复内容开始(15:05:15)--- using (var scope = ServiceProvider.CreateScope()){ var aSubscriber = Activato ...
- Java Native Interface Specification Contents 翻译
https://docs.oracle.com/en/java/javase/12/docs/specs/jni/index.html Google翻译 第1章:简介 本章介绍Java Native ...
- Discuz x3 UCenter实现同步登陆原理
1.Discuz x3 的登录页面URL是:/member.php?mod=logging&action=login 2.这个登录页面,登录提交的地址是: <form method=&q ...