位运算刷题+总结

文章目录

  • 判定字符是否唯一
    • 题解
    • 代码
  • 丢失的数字
    • 题解
    • 代码
  • 两整数之和
    • 题解
    • 代码
  • 只出现一次的数字 II
    • 题解
    • 代码
  • 消失的两个数字
    • 题解
    • 代码
  • 总结

判定字符是否唯一

题目链接
在这里插入图片描述

题解

1. 哈希表,创建26个空间大小的哈希表
2. 位图,小写字符只有26个,位图可以存32个0或1,(bitMap >> i) & 1 判断是否存在元素,bitMap |= (1 << i)把元素加入到位图中

代码

class Solution 
{
public:bool isUnique(string astr) {// 位图// >26个字符说明存在重复的字符了// 优化int n = astr.size();if(n > 26) return false;int bitmap = 0;for(auto ch : astr){int i = ch - 'a';// 判断是否存在重复元素if((bitmap >> i) & 1) return false;// 不存在重复的元素就加入到位图中bitmap |= (1 << i);}return true;}
};

丢失的数字

题目链接
在这里插入图片描述

题解

1. 哈希表,开大小为n+1的空间,把所有的数加入到哈希表中,如果这个数没有出现,就是丢失的数
2. 高斯求和,(首项加尾项)* 项数 /2 - 数组中元素的和3
3. 位运算,用一个变量异或0到n的所有的数,再和数组中的数异或,就可以找到缺失的数

代码

class Solution 
{
public:int missingNumber(vector<int>& nums) {int n = nums.size();int sum = 0;for(int i = 0;i <= n;i++) sum ^= i;for(int i = 0;i < n;i++){sum ^= nums[i];}return sum;}
};

两整数之和

题目链接
在这里插入图片描述

题解

1. a ^ b无进位相加,(a & b) << 1进位,直到进位为0,就是答案

在这里插入图片描述

代码

class Solution 
{
public:int getSum(int a, int b) {// 异或(无进位相加) &并且左移一位求进位,进位到下一位上// 直到进位为0,就时最终答案int k = (a & b) << 1;int sum = a ^ b;while(k){a = sum;b = k;// 无进位相加sum = a ^ b;// 进位k = (a & b) << 1;}return sum;}
};

只出现一次的数字 II

题目链接
在这里插入图片描述

题解

1. 每个数都出现了3次,有3n个数,和只存在一个的数的某个比特位相加,再模3就是和只出现一次的数的比特位是一样的
2. 因此只需要算出数组中每个数的二进制的每个位的加和,再模3就是只出现一次的那个数的每个二进制位

在这里插入图片描述

代码

class Solution 
{
public:int singleNumber(vector<int>& nums) {int bit = 0;int n = nums.size();for(int j = 0;j <= 31;j++){int sum = 0;for(int i = 0;i < n;i++){if(((nums[i] >> j) & 1) == 1) sum++; }sum %= 3;if(sum == 1) bit |= (1 << j);}return bit;// map<int,int> ret;// for(auto x : nums) ret[x]++;// for(auto y : nums)// {//     if(ret[y] == 1) return y;// }   // return -1;}
};

消失的两个数字

题目链接
在这里插入图片描述

题解

1. 根据x位的不同,如何划分为两类异或?
如果x位上为1的是一组,x为上是0的是一组
比如:第二组样例
010 010
011 011
001 100

001 ^ 100 = 101
x = 1
第一位上为1的是一组,是0的是一组
010 010 100 -> 100
011 011 001 -> 001
这样就得到了答案

在这里插入图片描述

代码

class Solution 
{
public:vector<int> missingTwo(vector<int>& nums) {// 1.先找出消失两个数异或的结果// 2.再分开消失的两个数// 这两个数异或的结果肯定不会是0,至少有一位是1// 那就根据这位划分为两类异或// 划分为这位是1的和0的int sum = 0;int n = nums.size();for(int i = 1;i <= n+2;i++) sum ^= i;for(int i = 0;i < n;i++) sum ^= nums[i];// 提取这个1int tmp = sum & (-sum);int k = 0;for(int i = 0;i < 32;i++) {if((tmp >> i) & 1){k = i;break;}}int m = 0,t = 0;for(int i = 0;i < n;i++){if((nums[i] >> k) & 1) m ^= nums[i];else t ^= nums[i];}for(int i = 1;i <= n + 2;i++){if((i >> k) & 1) m ^= i;else t ^= i;}return {m,t};// vector<int> ret;// int hash[30010] = {0};// int n = nums.size();// for(int i = 0;i < n;i++)// {//     hash[nums[i]]++;// }// for(int i = 1;i <= n+2;i++) // {//     if(hash[i] == 0) ret.push_back(i);// }// return ret;}
};

总结

1. 给你一个数n,确定这个数的二进制表示上的第x位是0还是1?
(n>>x) & 1,== 0就是0,==1就是1
2. 将一个数n的二进制表示的第x位修改为1?
n = n | (1 << x)
3.将一个数n的二进制表示的第x为修改为0?
n = n & ~(1 << x)
4. 提取一个数n二进制表示中的最右侧的1?
n & (-n) 左侧被n取反后再按位与之后都变成了0,1的右侧都加1都变成了0
5. 干掉一个数n二进制表示中最右侧的1?
n & (n-1) 减一之后会向左边借1,借位的位置变为了0,它的右侧都变成了1,再按位与之后包括它本身都会变成0
6. 异或运算的规律
0 ^ a = a
0 ^ 0 = 0
a ^ a = 0

7. 位图总结
位图可以看成可以存32个二进制位的数组,(bitMap >> i) & 1 判断这一位是否存在,如果存在就加入到位图中,bitMap |= (1 << i)
8. 基础位运算
& | ^ ~ >> <<
9.运算符的优先级
如果判断不了运算符的优先级,就直接加括号

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

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

相关文章

Qt表格美化笔记

介绍 表格是一种常见的数据管理界面形式&#xff0c;在大批量的数据交互情形下使用的比较多 表格 可以通过样式表设置线条以及边框的颜色 QTableWidget { gridline-color : rgb(55, 60, 62); border: 1px solid rgb(62,112,181);}表头 如果表头和第一行的分割线显示&#…

【Godot4.2】Vector2向量插值的应用

求线段的等分点 extends Node2Dvar pos:Vector2 var split_num:int var p1 Vector2(200,200) var p2 Vector2(100,100)func _input(event: InputEvent) -> void:if event is InputEventMouseButton:if event.button_index MOUSE_BUTTON_WHEEL_DOWN:split_num clamp(spl…

Git使用(二)--如何配置 GitHub 远程仓库及本地 Git 环境

在日常的开发过程中&#xff0c;使用版本控制工具 Git 是一个非常重要的技能&#xff0c;特别是对于管理和协作开发。通过 GitHub&#xff0c;我们可以轻松地进行代码版本管理和共享。这篇博客将带您一步步学习如何配置 Git 环境并将本地仓库与 GitHub 远程仓库连接起来。 一、…

【算法工具】HDL: 基于摘要统计数据的高维连锁不平衡分析软件

## 前言 在基因组研究中&#xff0c;连锁不平衡(Linkage Disequilibrium, LD)分析是理解遗传变异之间关联的关键步骤。然而&#xff0c;当面对高维数据时&#xff0c;传统分析方法往往面临巨大计算挑战。今天为大家介绍一款强大的工具——HDL (High-Dimensional Linkage diseq…

MongoDB副本集部署完整教程

一般而言&#xff0c;副本集主要成员有三个&#xff1a;主节点&#xff0c;副本节点&#xff0c;仲裁节点 按照官方推荐方案&#xff0c;我们搭建一个三成员的副本集&#xff0c;这个副本集由一个主结点和两个副本结点组成。 这里采用三台虚拟机进行部署&#xff1a;node1(主节…

springcloud gateway通过数据库获取路由信息

在 Spring Cloud Gateway 中结合 MyBatis 动态从数据库加载路由配置&#xff0c;可以实现灵活的路由管理。以下是详细实现步骤&#xff1a; 1. 数据库表设计 创建路由配置表 gateway_route&#xff1a; CREATE TABLE gateway_route (id varchar(50) NOT NULL COMMENT 路由唯一…

蓝桥杯嵌入式组第十二届省赛题目解析+STM32G431RBT6实现源码

文章目录 1.题目解析1.1 分而治之&#xff0c;藕断丝连1.2 模块化思维导图1.3 模块解析1.3.1 KEY模块1.3.2 LED模块1.3.3 LCD模块1.3.4 TIM模块1.3.5 UART模块1.3.5.1 uart数据解析 2.源码3.第十二届题目 前言&#xff1a;STM32G431RBT6实现嵌入式组第十二届题目解析源码&#…

Git 的基本概念和使用方式(附有思维导图)

一、Git 简介 Git 是一个开源的分布式版本控制系统&#xff0c;由 Linus Torvalds 在 2005 年为帮助管理 Linux 内核开发版本而开发 。与集中式版本控制系统&#xff08;如 SVN&#xff09;不同&#xff0c;在分布式系统中&#xff0c;每个开发者的本地机器都拥有一个完整的 G…

【微服务】Nacos 配置动态刷新(简易版)(附配置)

文章目录 1、实现方法2、配置依赖 yaml3、验证效果 1、实现方法 环境&#xff1a;Nacos、Java、SpringBoot等 主要是在boostrap.yaml中的data-id属性下配置refresh:true来实现动态更新 2、配置依赖 yaml 具体的版本参考官方的说明&#xff1a;官方版本说明 <!--读取boo…

mac 被禁用docker ui后,如何使用lima虚拟机启动docker

本机macos 安装lima brew install lima创建配置 echo "\\ndynamic:\n big-sur:\n image: docker://docker:git\n linux:\n image: docker.io/limasoftware/ubuntu:20.04 \\n" > ~/.lima/default.yaml启动名叫default的虚拟机 limactl start default进…

WIFI无ip分配之解决方法(Solution to WiFi without IP allocation)

WIFI无ip分配之解决方法 在信息化无比发达的当下社会&#xff0c;电脑在日常生活中也发挥着巨大的作用&#xff0c;不管是电脑还是手机只有在网络环境中才能得到更好的运用。然而很多朋友在使用网络的时候都会遇到一些问题&#xff0c;最常见的就是无线网络连接上但是WiFi无IP…

bootloader相关部分

简单说明 程序烧录的方式主要有ICP,ISP,IAP 其中ICP就是常用的jlink等工具 ISP就是利用MCU自带的一些特殊引脚烧录&#xff0c;比如uart IAP就是利用用户写的bootloader代码烧录 bootloader主要分为三层&#xff0c;厂家出厂的bootrom ,用户自己写的bootloader&#xff0c;…

同盾v2 2025版 blackbox , wasm加解密,逆向协议算法生成,小盾安全

声明 本文章中所有内容仅供学习交流&#xff0c;抓包内容、敏感网址、数据接口均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff0c;若有侵权&#xff0c;请联系我立即删除&#xff01; # 欢迎交流 wjxch1004

云平台一键部署【SGLang】适用于大型语言模型和视觉语言模型的快速服务框架

SGLang 是一个适用于大型语言模型和视觉语言模型的快速服务框架。它通过共同设计后端运行时和前端语言&#xff0c;使您与模型的交互更快、更可控。 优点&#xff1a; 1.吞吐量碾压级优势 2.结构化输出快如闪电 3.多 GPU 优化 SGLang模型已经在趋动云『社区项目』上线&am…

Matlab深度学习ResNet、迁移学习多标签图像分类及超分辨率处理Grad CAM可视化分析COCO、手写数字数据集...

全文链接&#xff1a;https://tecdat.cn/?p40982 在当今数字化时代&#xff0c;图像分类和图像超分辨率处理是计算机视觉领域的重要研究方向。深度学习技术的发展为解决这些问题提供了强大的工具。本文将详细介绍如何使用Matlab构建多标签图像分类模型和图像到图像的回归网络&…

驾培市场与低空经济无人机融合技术详解

随着科技的飞速发展和社会的不断进步&#xff0c;驾培市场正面临着前所未有的变革。传统汽车驾驶培训已不再是唯一的选择&#xff0c;无人机驾驶等新兴领域正逐渐成为驾培市场的重要组成部分。本报告旨在探讨驾培市场与低空经济的融合发展&#xff0c;特别是应用型人才培养与驾…

OpenHarmony-SELinux配置

前言&#xff1a; OpenHarmony 上某个进程向samgr注册SA服务&#xff0c;其他进程在与该进程进行IPC通信之前&#xff0c;需要获取该SA服务&#xff0c;SA提供方需要为该SA配置SELinux标签&#xff0c;否则该SA会被SELinux配置为u:object_r:default_service:s0标签&#xff0c…

信息安全访问控制、抗攻击技术、安全体系和评估(高软42)

系列文章目录 信息安全访问控制、抗攻击技术、安全体系和评估 文章目录 系列文章目录前言一、信息安全技术1.访问控制2.抗攻击技术 二、欺骗技术1.ARP欺骗2.DNS欺骗3.IP欺骗 三、抗攻击技术1.端口扫描2.强化TCP/IP堆栈 四、保证体系和评估1.保证体系2.安全风险管理 五、真题在…

使用Nodejs基于DeepSeek加chromadb实现RAG检索增强生成 本地知识库

定义 检索增强生成&#xff08;RAG&#xff09;的基本定义 检索增强生成&#xff08;Retrieval-Augmented Generation&#xff0c;简称RAG&#xff09;是一种结合了信息检索技术与语言生成模型的人工智能技术。RAG通过从外部知识库中检索相关信息&#xff0c;并将其作为提示&…

LeeCode题库第五十二题

52.N皇后 项目场景&#xff1a; n 皇后问题 研究的是如何将 n 个皇后放置在 n n 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回 n 皇后问题 不同的解决方案的数量。 示例 1&#xff1a; 输入&#xff1a;n 4 输出&#xff1a;2…