当前位置: 首页 > article >正文

【笑着写算法系列】位运算

前言

位运算可以说是一个算法里面比较神奇的算法,利用这个算法可以用极少的资源来完成一些运算,主要得力于位运算的一些特殊的性质。

在进行题目练习之前我们先了解一下有关位运算的一些主要作用:

  1. 确定一个数n的第x位二进制位是0还是1,我们可以使用((n>>x)&1))==1,来进行判断。
  2. 将一个数n的第x位二进制 改成1,n=n|(1<<x)
  3. 将一个数n的第x位二进制改成0,n=n&(~(1<<x))
  4. 提取一个数n二进制位中最右侧的1,n&(-n)
  5. 干掉一个数n二进制位中最右侧的1,n&(n-1)
  6. 0^n=n;
  7. n^n=0;
  8. a^b^c=a^(b^c);

位图的使用:
什么是位图呢,你可以理解为将一个数的二级制位如:int n。我们可以用n的32个二进制位来进行信息的存储。比如这个二进制位为1代表一个数出现过,0代表这个数没有出现过。类似于一种简单的hash表。

一、丢失的数字

参考答案及其解析:\

既然我们这篇文章设计位运算,那么我就讲解如何利用位运算进行快速解决这个问题。

我们就借助位运算中"^"这个异或运算符,首先我们要直到异或的两个特殊情况,

0^n=n;

n^n=0;

且a^b^c=a^(b^c);

就是上面这两个特殊情况就可以让我们很快的解决这个问题,因为再[0,n]的范围内缺少了一个数,那么我们先是把数组中所有的数进行异或,然后顺便把0-n中的每个数也进行异或,这样除了那个缺失的数,其余的每个数相互异或=0,只剩一个缺失的数x^0=x,我们只需要返回这个数即可。

class Solution {public int missingNumber(int[] nums) {int n=nums.length;int ret=0;int i=0;for(i=0;i<n;i++){ret^=nums[i]^i;  }return ret^i;}
}

二、判定字符是否唯一

参考答案及其解析:

这里我们运用到“位图”,即:我们可以使用一个基本类型的每个比特位(也就是每个二进制位)模拟成一个简单的hash表,这样我们就可以减少空间复杂度,例如:题目中说只要存在重复的字母就返回false,否则返回true,那么我们就像是模范hash表,只要字母出现过我们就tmp中的对应的位改成1,每次循环检查当前字母对应的位数为1的话,我们就直接返回false。

优化:鸽巢原理进行优化,即:题目告诉我们只有小写字母,那么只要这个字符串astr的长度超过26个,就一定会有重复的字母。

class Solution {public boolean isUnique(String astr) {if(astr.length()>26) return false;int tmp=0;int c;for(int i=0;i<astr.length();i++){c=astr.charAt(i);if((tmp>>(c-'a')&1)==1) return false;else tmp=tmp|(1<<c-'a');}return true;}
}

三、两整数之和(不是要+号)

参考代码及其解析:

我们要知道异或这个操作也可以被称为无进位相加。那么我们想要实现真正的相加且不用+号,那么我们就必须要找到对应的进位,然后再进行相加(不断循环),直到这个进位为carry=0;如下代码:我们先是计算当前进位carry。然后进行异或(无进位相加)然后再继续循环相加,直到没有进位为0。

class Solution {public int getSum(int a, int b) {while (b != 0) {int carry = (a & b) << 1;a = a ^ b;b = carry;}return a;}
}

四、只出现一次的数字

参考代码及其解析:

首先题目告诉我们数组除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。那么我们就按照整型的32个二进制位来进行操作,因为我们要排除掉出现三次的元素,只留下出现一次的元素,这时我们可以计算每个位中1的个数然后进行%3取模操作,这样我们就可以将三个相同的数的位数除去,只剩下出现一次的数决定那个位数。

class Solution4 {public int singleNumber(int[] nums) {int ret=0;for(int i=0;i<32;i++){int n=0;for(int j=0;j<nums.length;j++){n+=(nums[j]>>i)&1;}if(n%3!=0)  ret|=1<<i;}return ret;}
}

五、消失的两个数字

参考代码及其解析:

根据题目我们先是将数组中所有的值和1-N的所有值进行异或,这时得到的值就是那两个缺失的数字异或的值tmp,那么这时我们就可以根据这个异或得到的值将我们数组中的值和1-N分成两类,如何分呢?

首先我们根据得到的tmp值随便找出一位其中一个为1的二进制位,然后根据这个二进制是否为1对数组中的值和1-N分成两类,然后分别异或,得到的两个值就是缺失的那两个数了。

因为那个二进制位为1说明缺失的a和b这两个数这个二进制肯定是不同的,根据这个分类就不会把a和b分到同一类了。

class Solution {public int[] missingTwo(int[] nums) {int n=nums.length;int tmp=nums[0];int[] ret=new int[2];for(int i=1;i<n;i++){tmp^=i^nums[i];}tmp^=(n+2)^(n+1)^n;int i=0;for(i=0;i<32;i++){if(((tmp>>i)&1)==1) break;   }for(int num:nums){if(((num>>i)&1)==1) ret[0]^=num;else ret[1]^=num;}for(int j=1;j<=n+2;j++){if(((j>>i)&1)==1) ret[0]^=j;else ret[1]^=j;}return ret;}
}

相关文章:

【笑着写算法系列】位运算

前言 位运算可以说是一个算法里面比较神奇的算法&#xff0c;利用这个算法可以用极少的资源来完成一些运算&#xff0c;主要得力于位运算的一些特殊的性质。 在进行题目练习之前我们先了解一下有关位运算的一些主要作用: 确定一个数n的第x位二进制位是0还是1,我们可以使用(&a…...

【CCF CSP-J 2020】优秀的拆分

前言 请勿抄袭。 思路 二进制操作题。 首先&#xff0c;根据题意&#xff0c;如果给定的 n n n 是奇数那么直接输出 -1。 然后&#xff0c;可以发现题目是要求我们把 n n n 拆成 2 a 1 2 a 2 . . . 2 a x 2^{a_1}2^{a_2}...2^{a_x} 2a1​2a2​...2ax​ 这种形式。 看…...

chrome V3插件开发,调用 chrome.action.setIcon,提示路径找不到

问题描述&#xff1a; chrome V3插件开发&#xff0c;调用 chrome.action.setIcon&#xff0c;提示路径找不到。 解决问题过程&#xff1a; chrome插件v2版本中设置插件图标接口是&#xff1a;chrome.browserAction.setIcon。v3 版本种接口是 chrome.action.setIcon。同样的…...

大数据组件(四)快速入门实时数据湖存储系统Apache Paimon(2)

大数据组件(四)快速入门实时数据湖存储系统Apache Paimon(2) 我们上次已经了解了Paimon的下载及安装&#xff0c;并且了解了主键表的引擎以及changelog-producer的含义 大数据组件(四)快速入门实时数据湖存储系统Apache Paimon(1) 今天&#xff0c;我们继续快速了解下最近比…...

多模态机器学习火热idea汇总!

想发论文&#xff0c;却完全没头绪&#xff1f;那我非常推荐你关注这个潜力方向&#xff1a;多模态机器学习&#xff01; 它能够把不同模态的数据&#xff0c;映射到统一的高维向量空间&#xff0c;实现模态间的语义对齐&#xff0c;从而促进模态间的相互理解&#xff0c;提高…...

【MySQL】简单掌握数据类型与表操作,让数据库性能飞跃

个人主页&#xff1a;♡喜欢做梦 欢迎 &#x1f44d;点赞 ➕关注 ❤️收藏 &#x1f4ac;评论 目录 &#x1f333;一、数据类型 &#x1f343;1.数值类型 &#x1f342;整型类型 &#x1f342;浮点型类型 &#x1f342;定点数类型 &#x1f343;2.字符串类型 3.&am…...

学习数据结构(11)二叉树(堆)下

1.堆的概念 如果有⼀个集合 K {k0&#xff0c;k1&#xff0c;k2&#xff0c;...&#xff0c;k(n-1)} &#xff0c;把它的所有元素按完全二叉树的形式存储在一个一维数组中&#xff0c;并满足&#xff1a;K(i)<2*i1且K(i)<2*i2&#xff08;K(i)>2*i1且K(i)>2*i2&a…...

计算机毕业设计Python房价预测 房源推荐系统 房源分析可视化(源码+LW文档+PPT+详细讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

JDBC 入门:从基础到实战

一、JDBC 概述 JDBC&#xff0c;即 Java DataBase Connectivity&#xff0c;是 Java 用于连接数据库的技术&#xff0c;旨在通过 Java 代码操作数据库。它是一套接口规范&#xff0c;其实现类由各数据库生产商提供。掌握 JDBC 接口和方法&#xff0c;就能操作不同数据库。而驱…...

vue中为组建添加样式的方式

在 Vue 中&#xff0c;可以通过多种方式为 view 添加样式&#xff0c;并且支持动态绑定样式。以下是几种常见的方式&#xff1a; 1. 内联样式 直接在模板中使用 style 属性来添加样式。 <template><div style"color: red; font-size: 14px;">这是一个…...

Linux探秘坊-------5.git

1.git介绍 1.版本控制器 为了能够更⽅便我们管理这些不同版本的⽂件&#xff0c;便有了版本控制器。所谓的版本控制器&#xff0c;就是能让你了解到⼀个⽂件的历史&#xff0c;以及它的发展过程的系统。通俗的讲就是⼀个可以记录⼯程的每⼀次改动和版本迭代的⼀个管理系统&am…...

训练与优化

训练与优化 损失函数与反向传播 损失函数能够衡量神经网络输出与目标值之间的误差&#xff0c;同时为反向传播提供依据&#xff0c;计算梯度来优化网络中的参数。 torch.nn.L1Loss 计算所有预测值与真实值之间的绝对差。参数为 reduction &#xff1a; none&#xff1a;不对…...

VsCode美化 Json

1.扩展中输入:pretty json 2. &#xff08;CtrlA&#xff09;选择Json文本 示例:{ "name" : "runoob" , "alexa" :10000, "site" : null , "sites" :[ "Google" , "Runoob" , "T…...

基于Spring Boot的社区居民健康管理平台的设计与实现

目录 1 绪论 1.1 研究现状 1.2 研究意义 1.3 组织结构 2 技术介绍 2.1 平台开发工具和环境 2.2 Vue介绍 2.3 Spring Boot 2.4 MyBatis 2.5 环境搭建 3 系统需求分析 3.1 可行性分析 3.2 功能需求分析 3.3 系统用例图 3.4 系统功能图 4 系统设计 4.1 系统总体描…...

使用Java爬虫获取京东商品SKU信息的完整指南

在电商领域&#xff0c;商品SKU&#xff08;Stock Keeping Unit&#xff09;信息是商家和消费者都非常关注的内容。SKU信息不仅包括商品的基本属性&#xff08;如价格、库存、规格等&#xff09;&#xff0c;还涉及到商品的动态数据&#xff08;如促销信息、库存状态等&#xf…...

面试题之Vuex,sessionStorage,localStorage的区别

Vuex、localStorage 和 sessionStorage 都是用于存储数据的技术&#xff0c;但它们在存储范围、存储方式、应用场景等方面存在显著区别。以下是它们的详细对比&#xff1a; 1. 存储范围 Vuex&#xff1a; 是 Vue.js 的状态管理库&#xff0c;用于存储全局状态。 数据存储在内…...

ssm121基于ssm的开放式教学评价管理系统+vue(源码+包运行+LW+技术指导)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…...

【深度学习】Transformer入门:通俗易懂的介绍

【深度学习】Transformer入门&#xff1a;通俗易懂的介绍 一、引言二、从前的“读句子”方式三、Transformer的“超级阅读能力”四、Transformer是怎么做到的&#xff1f;五、Transformer的“多视角”能力六、Transformer的“位置记忆”七、Transformer的“翻译流程”八、Trans…...

大语言模型内容安全的方式有哪些

大语言模型内容安全的方式有哪些 LLM(大语言模型)内容安全方式主要是通过技术手段对模型生成的内容进行检测、过滤和干预,以确保输出符合道德、法律和社会规范。以下是一些常见的方式方法及其原理和著名的应用案例: 基于规则的过滤 原理:制定一系列明确的规则和模式,例…...

《深度学习》——ResNet网络

文章目录 ResNet网络ResNet网络实例导入所需库下载训练数据和测试数据设置每个批次的样本个数判断是否使用GPU定义残差模块定义ResNet网络模型导入GPU定义训练函数定义测试函数创建损失函数和优化器训练测试数据结果 ResNet网络 ResNet&#xff08;Residual Network&#xff0…...

【Windows软件 - HeidiSQL】导出数据库

HeidSQL导出数据库 软件信息 具体操作 示例文件 选项分析 选项&#xff08;1&#xff09; 结果&#xff08;1&#xff09; -- -------------------------------------------------------- -- 主机: 127.0.0.1 -- 服务器版本: …...

FFmpeg 全面知识大纲梳理

1. FFmpeg 简介 FFmpeg 是什么: 一个开源的多媒体处理框架,用于处理音频、视频和流媒体。支持多种格式和编解码器。提供命令行工具和库(如 libavcodec, libavformat, libavfilter 等)。主要功能: 格式转换编解码流媒体处理音视频剪辑、合并、分离添加滤镜、特效压缩与优化…...

【达梦数据库】dblink连接[SqlServer/Mysql]报错处理

目录 背景问题1&#xff1a;无法测试以ODBC数据源方式访问的外部链接!问题分析&原因解决方法 问题2&#xff1a;DBLINK连接丢失问题分析&原因解决方法 问题3&#xff1a;DBIINK远程服务器获取对象[xxx]失败,错误洋情[[FreeTDS][SQL Server]Could not find stored proce…...

基于 Spring Boot 的社区居民健康管理系统部署说明书

目录 1 系统概述 2 准备资料 3 系统安装与部署 3.1 数据库部署 3.1.1 MySQL 的部署 3.1.2 Navicat 的部署 3.2 服务器部署 3.3 客户端部署 4 系统配置与优化 5 其他 基于 Spring Boot 的社区居民健康管理系统部署说明书 1 系统概述 本系统主要运用了 Spri…...

量化噪声介绍

量化噪声是在将模拟信号转换为数字信号的量化过程中产生的噪声。以下为你详细介绍&#xff1a; 1. 量化的基本概念 在模拟信号数字化过程中&#xff0c;采样是对模拟信号在时间上进行离散化&#xff0c;而量化则是对采样值在幅度上进行离散化。由于模拟信号的取值是连续的&am…...

java断点调试(debug)

在开发中&#xff0c;新手程序员在查找错误时, 这时老程序员就会温馨提示&#xff0c;可以用断点调试&#xff0c;一步一步的看源码执行的过程&#xff0c;从而发现错误所在。 重要提示: 断点调试过程是运行状态&#xff0c;是以对象的运行类型来执行的 断点调试介绍 断点调试是…...

最新智能优化算法:牛优化( Ox Optimizer,OX)算法求解经典23个函数测试集,MATLAB代码

一、牛优化算法 牛优化&#xff08; OX Optimizer&#xff0c;OX&#xff09;算法由 AhmadK.AlHwaitat 与 andHussamN.Fakhouri于2024年提出&#xff0c;该算法的设计灵感来源于公牛的行为特性。公牛以其巨大的力量而闻名&#xff0c;能够承载沉重的负担并进行远距离运输。这种…...

Redis7——基础篇(四)

前言&#xff1a;此篇文章系本人学习过程中记录下来的笔记&#xff0c;里面难免会有不少欠缺的地方&#xff0c;诚心期待大家多多给予指教。 基础篇&#xff1a; Redis&#xff08;一&#xff09;Redis&#xff08;二&#xff09;Redis&#xff08;三&#xff09; 接上期内容&…...

Git备忘录(三)

设置用户信息: git config --global user.name “itcast” git config --global user.email “ helloitcast.cn” 查看配置信息 git config --global user.name git config --global user.email $ git init $ git remote add origin gitgitee.com:XXX/avas.git $ git pull or…...

MySQL 之INDEX 索引(Index Index of MySQL)

MySQL 之INDEX 索引 1.4 INDEX 索引 1.4.1 索引介绍 索引&#xff1a;是排序的快速查找的特殊数据结构&#xff0c;定义作为查找条件的字段上&#xff0c;又称为键 key&#xff0c;索引通过存储引擎实现。 优点 大大加快数据的检索速度; 创建唯一性索引&#xff0c;保证数…...