生成n套数位加减乘除_leetcode 算法汇总(四)位运算

b8c0bc6f83e4e63e4f735d41065c0ef1.png

一、 运算符

  • & 与运算: 两个位都是 1 时,结果才为 1,否则为 0
  • | 或运算: 两个位都是 0 时,结果才为 0,否则为 1
  • ^ 异或运算: 两个位相同则为 0,不同则为 1
  • ~ 取反运算:0 则变为 1,1 则变为 0
  • << 左移运算:向左进行移位操作,高位丢弃,低位补 0 (每左移一位相当于乘一次2)
  • >> 右移运算:向右进行移位操作,对无符号数,高位补 0,对于有符号数,高位补符号位 (每右移一位相当于除一次2)

二、 应用场景

^ 异或运算性质:

(1)交换律

(2)结合律(即(a^b)^c == a^(b^c))

(3)对于任何数x,都有x^x=0,x^0=x

(4)自反性 A ^ B ^ B = A ^ 0 = A

常见应用

  • 与运算的应用:(1)清零。如果想将一个单元清零,即使其全部二进制位为0,只要与一个各位都为零的数值相与,结果为零。 (2)取一个数中指定位
  • 或运算的应用: 对一个数的某几位补1
  • 异或运算的应用: 消去一对重复的数(利用上面), 交换变量等等。
  • 取模: 位运算比加减乘除更加高效。 所以在一些底层的组件例如jdk, redis 中经常用位运算,比如用<< ,>>代替乘除, 用& 代替取模操作。
  • 状态压缩和位图: 位运算可以用压缩存储和表示信息。 每个二进制位有0|1 两种状态, 那一个int32 可以表示出 32种状态。 比如linux中的文件状态中的read ,write, 和执行权限就可以用三个二进制位表示, 7(111)表示有Read的权限,有Write的权限和执行的权限。

三、 例题

1、 不使用中间变量交换两数

// 思路: 利用上面提到的异或的结合率 和自反率
// a = (a ^ b) ^ b , b = a ^ b ^ a
void swap(int &a, int &b) {a ^= b;b ^= a;a ^= b;
}

2、 数组中,只有一个数出现一次,剩下都出现两次,找出出现一次的数 (leetcode - 136)

    public int singleNumber(int[] nums) {int res = 0;for(int i = 0; i < nums.length; i++) {res = res ^ nums[i];}return res;}

3、 用 O(1) 时间检测整数 n 是否是 2 的幂次 (LintCode - 142)

/** 思路: 常用技巧:n&(n-1)消去n 的二进制最后一位的1
* 比如3&(3-1) = (11)&(10) = (10) , 
* 如果是2的幂次, 那二进制形式下只有一位是1, 消去后为0
*/    public boolean checkPowerOf2(int n) {if(n <= 0) return false;return (n & (n - 1)) == 0;}

4、子集列举 (leetcode - 78 medium)

描述:

Given a set of distinct integers, nums, return all possible subsets (the power set).

Note: The solution set must not contain duplicate subsets.

Example:

Input: nums = [1,2,3]
Output:
[[3],[1],[2],[1,2,3],[1,3],[2,3],[1,2],[]
]

思路:(这道题递归做感觉也很容易理解)

注意数组中数字唯一,可以把这道题理解成高中数学中的排列组合问题。每个数字有取或不取两种可能性, n个数有2的n次方个子集。 可以用一个正整数二进制表示的第i位是1还是0,代表集合的第i个数取或者不取。类似下图:

0 000 {}
1 001 {1}
2 010 {2}
3 011 {1,2}
4 100 {3}
5 101 {1,3}
6 110 {2,3}
7 111 {1,2,3}

A:

    vector<vector<int>> subsets(vector<int>& nums) {int n = nums.size()int p = 1 << n;vector<vector<int>> subs(p);for (int i = 0; i < p; i++) {for (int j = 0; j < n; j++) {// 用 i>>j & 1的方式遍历每一位if ((i >> j) & 1) {subs[i].push_back(nums[j]);}}}return subs;}

5、 位图

描述:有一千万个整数,整数范围在1到1亿之间, 如何快速查找某个整数是否在这1千万个整数中。

思路: 用一个bit 数组来存储这1-1亿之间的数。如果数字存在, 在对应的下标上标1, 1亿个数只需要1亿个bit位。

public class BitMap { // Java 中 char 类型占 16bit,也即是 2 个字节private char[] bytes;private int nbits;public BitMap(int nbits) {this.nbits = nbits;this.bytes = new char[nbits/16+1];}public void set(int k) {if (k > nbits) return;int byteIndex = k / 16;int bitIndex = k % 16;bytes[byteIndex] |= (1 << bitIndex);}public boolean get(int k) {if (k > nbits) return false;int byteIndex = k / 16;int bitIndex = k % 16;return (bytes[byteIndex] & (1 << bitIndex)) != 0;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/454223.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习算法之 K-means、层次聚类,谱聚类

k-means 和层次聚类都属于划分聚类&#xff0c;实际中最常用的是k-means&#xff0c;k-means效果不好的情况下才会采用其他聚类 K-means算法 K-means算法&#xff0c;也称为K-平均或者K-均值&#xff0c;是一种使用广泛的最基础的聚类算法 假设输入样本为TX1,X2,…,Xm;则算法…

vue数据请求

我是vue菜鸟&#xff0c;第一次用vue做项目&#xff0c;写一些自己的理解&#xff0c;可能有些不正确&#xff0c;欢迎纠正。 vue开发环境要配置本地代理服务。把config文件加下的index.js里的dev添加一些内容&#xff0c; dev: {env: require(./dev.env),port: 8090,autoOpenB…

jetty部署多个web应用及将jetty配置成服务

通常情况下一个jetty部署一个java web应用&#xff0c;但一台服务只部署一个应用可能会造成资源浪费&#xff0c;所以有时候可能在一台服务器上要部署多个web应用。下面我们以一台server部署两个web应用为例。 服务器环境&#xff1a;安装JDK&#xff0c;2个jetyy9 重点&#x…

程序员成长的10个阶段

我的程序员成长之路 程序员的成长经历往往很相似&#xff0c;大部分的人走过了最前面相同的一段路&#xff0c;而有的人则走得更远。总结自己这些年来的历程&#xff0c;这也许能让年轻的程序员少走一些弯路&#xff0c;成长得更快&#xff1b;或许更好一些&#xff0c;能让大家…

mapper注解的主要作用_Mybatis中mapper的xml解析详解

上一篇文章分析了mapper注解关键类MapperAnnotationBuilder&#xff0c;今天来看mapper的项目了解析关键类XMLMapperBuilder。基础介绍回顾下之前是在分析configuration的初始化过程&#xff0c;已经进行到了最后一步mapperElement(root.evalNode("mappers"))&#x…

机器学习之梯度下降法(GD)和坐标轴下降法(CD)

梯度下降法 梯度下降法&#xff08;Gradient Descent, GD&#xff09;常用于求解无约束情况下凸函数&#xff08;Convex Function&#xff09;的极小值&#xff0c;是一种迭代类型的算法&#xff0c;因为凸函数只有一个极值点&#xff0c;故求解出来的极小值点就是函数的最小值…

阿里云Https部署网站

0、开始之前 文章图片很多&#xff0c;注意流量 首先你得准备好一个已经备案成功的域名&#xff0c;并且有一个在阿里云的服务器部署了的网站。 然后就是你迫切的希望升级网站为HTTPS部署。 那么我们开始吧&#xff01; 1、申请CA证书 1.1登录阿里云控制台&#xff0c;选择菜单…

mysql数据库多实例部署

本文系统&#xff1a;rhel5.8 ip : 192.168.100.150 数据库版本&#xff1a;mysql-5.6.15 1、创建部署mysql服务账号&#xff1a; 1234[rootdaf ~]# useradd -d /opt/mysql mysql [rootdaf ~]# echo "mysql" |passwd --stdin mysql Changing password for user mysq…

Python 第三方模块之 numpy.linalg - 线性代数

目录 numpy.linalg.det() 行列式 numpy.linalg.solve() 方程的解 numpy.linalg.inv() 逆矩阵 np.linalg.eig 特征值和特征向量 np.linalg.svd 奇异值分解 np.linalg.pinv 广义逆矩阵&#xff08;QR分解&#xff09; numpy.linalg模块包含线性代数的函数。使用这个模块&am…

rabbitmq direct 多个消费者_一文解析 RabbitMQ 最常用的三大模式

Direct 模式所有发送到 Direct Exchange 的消息被转发到 RouteKey 中指定的 Queue。Direct 模式可以使用 RabbitMQ 自带的 Exchange: default Exchange&#xff0c;所以不需要将 Exchange 进行任何绑定(binding)操作。消息传递时&#xff0c;RouteKey 必须完全匹配才会被队列接…

程序员成长最快的环境

除开五大或者ThoughtWorks这种要什么有什么&#xff0c;进去做打字也能光耀门楣的不谈。如果是嫁到一个普通软件公司&#xff0c;怎样的环境才能最快的成长呢&#xff1f;首先基本的 公司项目管理水平是必要的&#xff1b;其次是稳健而不保守的公司技术选型和一班能沟通的同事。…

【BZOJ4254】Aerial Tramway 树形DP

【BZOJ4254】Aerial Tramway 题意&#xff1a;给你一座山上n点的坐标&#xff0c;让你在山里建m条缆车&#xff0c;要求缆车两端的高度必须相等&#xff0c;且中间经过的点的高度都小于缆车的高度。并且不能存在一个点位于至少k条缆车的下方。求缆车的最大总长度。 n,m<200,…

C# 读取保存App.config配置文件的完整源码参考

最近出差在北京做一个小项目&#xff0c;项目里需要读取配置文件的小功能&#xff0c;觉得挺有参考意义的就把代码发上来给大家参考一下。我们选择了直接用微软的读取配置文件的方法。 这个是程序的运行设计效果&#xff0c;就是把这些参数可以进行灵活设置&#xff0c;灵活保存…

TensorFlow 简介

TensorFlow介绍 Tagline&#xff1a;An open-source software library for Machine Intelligence.Definition&#xff1a;TensorFlow TM is an open source software library fornumerical computation using data flow graphs.GitHub&#xff1a;https://github.com/tensorfl…

webbrowser设置为相应的IE版本

注册表路径&#xff1a; HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION 或者HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION 究竟选择哪一个…

jmeter压力测试_用Jmeter实现对接口的压力测试

一、多个真实用户对接口的压力测试1. 获取多个真实用户的token的两种方法&#xff1a;1)第一种&#xff1a;让开发帮忙生成多个token(多个用户账户生成的token)&#xff0c;导出为csv格式的文件(以下步骤均以该方法为基础)2)第二种&#xff1a;自己设置多个用户账户和密码&…

程序员成长之路(转)

什么时候才能成为一个专业程序员呢&#xff1f;三年还是五年工作经验&#xff1f;其实不用的&#xff0c;你马上就可以了&#xff0c;我没有骗你&#xff0c;因为专业程序员与业余程序员的区别主要在于一种态度&#xff0c;如果缺乏这种态度&#xff0c;拥有十年工作经验也还是…

嵌入式开发——PWM高级定时器

学习目标 加强掌握PWM开发流程理解定时器与通道的关系掌握多通道配置策略掌握互补PWM配置策略掌握定时器查询方式掌握代码抽取优化策略掌握PWM调试方式学习内容 需求 点亮8个灯,采用pwm的方式。 定时器 通道 <

解决虚拟机时间引起的奇怪问题

一直使用得好好的虚拟机最近出了一个奇怪问题在虚拟机装好的lamp在客户端访问phpmyadmin的时候,使用firefox登录没问题,但是使用IE不行总是停留在登录的界面,而且没有提供任何的出错信息,就连在apache的日志里面也看不到.注意到同样访问的时候,在IE上显示的转向的url是[url]htt…

TensorFlow 基本操作

Tensorflow基本概念 图(Graph):图描述了计算的过程&#xff0c;TensorFlow使用图来表示计算任务。张量(Tensor):TensorFlow使用tensor表示数据。每个Tensor是一个类型化的多维数组。操作(op):图中的节点被称为op(opearation的缩写)&#xff0c;一个op获得/输入0个或多个Tensor…