【练习】位运算思想

  • 🎥 个人主页:Dikz12
  • 🔥个人专栏:算法(Java)
  • 📕格言:吾愚多不敏,而愿加学
  • 欢迎大家👍点赞✍评论⭐收藏

目录

1.判断字符串是否唯一 

 题目描述

讲解 

代码实现

2.丢失的数字

 题目描述

​编辑 讲解

代码实现

3.两整数之和

题目描述 

 讲解

代码实现

4.只出现一次的数字II

题目描述

 讲解

 代码实现

5.消失的两个数字 

题目描述 

讲解 

代码实现 

常见位运算总结  

基础位运算

给一个数n,确定它的二进制表示中的第x位是0还是1.

将一个数n 的二进制表示的第x位修改成1

将一个数n的二进制表示的第x位修改成0

位图思想  

异或运算规律 


1.判断字符串是否唯一 

 题目描述

讲解 

解法一:使用哈希表(只有小写字母可用数组模拟)

解法二:位运算(位图思想).

利⽤「位图」的思想,每⼀个⽐特位 代表⼀个 字符,⼀个 int 类型的变量的 32 位⾜够;
表⽰所有的⼩写字⺟。⽐特位⾥⾯如果是 0 ,表⽰这个字符没有出现过。⽐特位⾥⾯的值是 1
表⽰该字符出现过

代码实现

    public boolean isUnique(String astr) {
        if(astr.length() > 26) {
            return false;
        }
        int bitMap = 0;
        for(int i = 0; i < astr.length(); i++) {
            int x = astr.charAt(i) - 'a';
            if(((bitMap >> x) & 1) == 1) {
                return false;
            }
            //添加字符
            bitMap |= 1 << x;
        }
        return true;
    }

2.丢失的数字

 题目描述

 讲解

解法一: 模拟哈希数组

解法二:高斯求和(推荐) 

解法三:异或运算. (推荐)

把数组中的所有数,以及 [0, n] 中的所有数全部「异或」在⼀起,那么根据「异或」
运算的「消消乐」规律,最终的异或结果应该就是缺失的数.

代码实现

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

3.两整数之和

题目描述 

 讲解

解法一:return a+b;(开个玩笑) .

这里要求不使用运算符"+"、"-",所以,也就只能使用位运算了.

解法二:位运算.

  • 异或 ^ 运算本质是:⽆进位加法
  • 按位与 & 操作能够得到进位
  • 然后⼀直循环进⾏,直到 进位变成 0 为⽌

代码实现

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

4.只出现一次的数字II

题目描述

 讲解

  1. 根据所有数的某⼀个⽐特位的总和 %3 的结果,快速定位到 ret 的⼀个⽐特位上的值是 0 还是 1
  2. 通过 ret 的每⼀个⽐特位上的值,就可以将 ret 给还原出来.

 代码实现

    public int singleNumber(int[] nums) {
        int ret = 0;
        for(int i = 0; i < 32; i++) {
            //统计比特位个数
            int sum = 0;
            for(int x : nums) {
                if(((x >> i) & 1) == 1) {
                    sum++;
                }
            }
            if(sum % 3 != 0) {
                //修改比特位
                ret |= 1 << i;
            }
        }
        return ret;
    }

5.消失的两个数字 

题目描述 

讲解 

  1.  将所有的数异或在一起 => 丢失的数字(ret = a^b)
  2. 找到 ret中,比特位 x 为 1 的那一位
  3. 根据 x位的不同,划分成两类异或.

代码实现 

    public int[] missingTwo(int[] nums) {
        // 1.将所有的数异或在一起
        int tmp = 0;
        for(int i = 0; i < nums.length; i++) {
            tmp ^= nums[i];
        }
        for(int i = 1; i <= nums.length + 2; i++) {
            tmp ^= i;
        }
        //2.找出tmp中,比特位为一的那一位 tmp = a ^ b
        int index = 0;
        while(true) {
            if(((tmp >> index) & 1) == 1) {
                break;
            }else{
               index++;
            } 
        }
        // 3.根据index位不同,分为两类异或
        int[] ret = new int[2];
        for(int x : nums) {
            if(((x >> index) & 1) == 1) {
                ret[1] ^= x;
            }else{
                ret[0] ^= x;
            }
        }
        for(int i = 1; i <= nums.length + 2; i++) {
               if(((i >> index) & 1) == 1) {
                ret[1] ^= i;
            }else{
                ret[0] ^= i;
            }
        }
        return ret;
    }

常见位运算总结  

基础位运算

&(按位与):有0就是0;

| (按位或):有 1 就是 1;

^ (按位异或):相同为0,相异为1 / 无进位相加;

>> 、<<、~ (右移、左移、按位取反)这几个就比较简单了,就不在说明了。

给一个数n,确定它的二进制表示中的第x位是0还是1.

将一个数n 的二进制表示的第x位修改成1

将一个数n的二进制表示的第x位修改成0

 

位图思想  

异或运算规律 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

重学Java 12 JavaBean

一、JavaBean的使用 1.标准javaBean JavaBean是Java语言编写类的一种标准规范&#xff0c;符合JavaBean的类&#xff0c;要求&#xff1a; ①类必须是具体的&#xff08;非抽象 abstract&#xff09;和公共的&#xff0c;public class 类名 ②并且具有无参数的构造方法&#x…

C#泛型,利用反射创建和普通创建泛型

泛型,利用反射创建和普通创建 反射 var input Activator.CreateInstance(typeof(Input<>).MakeGenericType(typeof(T))) as dynamic;typeof(T)这个位置可以塞入不同的类型 Activator.CreateInstance 反射动态创建实例&#xff1a; 这种方式使用 Activator.CreateIns…

Android Studio 之 Intent及其参数传递

一、Intent 显式Intent&#xff1a;通过组件名指定启动的目标组件,比如startActivity(new Intent(A.this,B.class)); 每次启动的组件只有一个~隐式Intent:不指定组件名,而指定Intent的Action,Data,或Category,当我们启动组件时, 会去匹配AndroidManifest.xml相关组件的Intent-…

《6G数据面架构研究》

目录 一、数据服务的定义二、6G数据服务驱动力及面临的挑战6G数据服务的业务驱动6G数据服务的技术驱动6G数据服务的网络内在驱动6G数据面面临的挑战 三、6G数据服务典型场景自动化网络运维用户体验提升通信感知数据服务 四、6G数据面架构研究数据面架构视图功能定义说明&#x…

在Windows上安装Go编译器并配置Golang开发环境

文章目录 1、安装Go语言编译程序1.1、下载GoLang编译器1.2、安装GoLang编译器 2、配置Golang IDE运行环境2.1、配置GO编译器2.1.1、GOROOT 概述2.1.2、GOROOT 作用2.1.2、配置 GOROOT 2.2、配置GO依赖管理2.2.1、Module管理依赖2.2.2、GOPATH 管理依赖 2.3、运行GO程序2.3.1、创…

CMake基础语法

目录 概述一、示例引入二、语法规则三、变量四、控制结构4.1 条件判断4.2 循环语句4.2.1 foreach循环4.2.2 while循环4.2.3 break、continue 五、函数六、文件操作七、环境配置7.1 设置交叉编译7.2 作用域7.3 属性 八、补充8.1 数学运算math 概述 首先我们都知道Makefile带来的…

堆放砖块-第12届蓝桥杯选拔赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第47讲。 堆放砖块&#xf…

【C语言】指针篇-初识指针(1/5)

&#x1f308;个人主页&#xff1a;是店小二呀 &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &#x1f308;C笔记专栏&#xff1a; C笔记 &#x1f308;喜欢的诗句:无人扶我青云志 我自踏雪至山巅 文章目录 **内存和地址(知识铺垫(了解即可))**如何理解编址**指针变量*…

海外短剧系统开发:引领全球短剧新潮流,打造跨文化娱乐新体验

随着全球化和互联网的快速发展&#xff0c;跨文化娱乐已经成为人们日常生活中不可或缺的一部分。海外短剧作为一种新颖、便捷的娱乐形式&#xff0c;正逐渐受到越来越多观众的喜爱。为了满足广大用户的需求&#xff0c;我们荣幸地推出全新的海外短剧系统开发方案&#xff0c;旨…

YOLOv8最新改进系列:融合DySample超轻量动态上采样算子,低延迟、高性能,目前最新上采样方法!!!遥遥领先!

YOLOv8最新改进系列&#xff1a;融合DySample超轻量动态上采样算子&#xff0c;低延迟、高性能&#xff0c;目前最新上采样方法&#xff01;&#xff01;&#xff01;遥遥领先&#xff01; DySample超轻量动态上采样算子全文戳这&#xff01;here! 详细的改进教程以及源码&am…

最新版守约者二级域名分发系统

主要功能 二级域名管理&#xff1a; 我们的系统提供全面的二级域名管理服务&#xff0c;让您轻松管理和配置二级域名。 域名分发&#xff1a;利用我们先进的域名分发技术&#xff0c;您可以自动化地分配和管理域名&#xff0c;确保每个用户或客户都能及时获得所需的域名资源。…

OJ刷题日记:1、双指针(2)

目录 1、11.盛最多的水 2、LCR 179.查找总价格为目标值的两个商品 3、15.三数之和 4、18.四数之和 1、11.盛最多的水 题目&#xff1a; 11. 盛最多水的容器 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/container-with-most-water/description/ …

45---M.2 SSD电路设计

视频链接 M.2 SSD硬件电路设计01_哔哩哔哩_bilibili M.2 SSD电路设计 1、M.2简介 1.1、M.2基本介绍 M.2接口也叫NGFF&#xff0c;英文全称Next Generation Form Factor。M.2接口是为超极本&#xff08;Ultrabook&#xff09;量身定做的新一代接口标准&#xff0c;是Intel推…

【微服务-Nacos】手把手教你Nacos集群部署,不会的来找我!

前面我们介绍了Nacos单机部署和微服务接入Nacos注册中心的操作步骤&#xff0c;但单机部署是分布式应用的大忌&#xff0c;在分布式架构中&#xff0c;任何单点都可能成为系统的瓶颈。因此关于Nacos部署&#xff0c;通常都是采用集群部署来为系统带来高可用性。这里我们来介绍下…

Python大数据分析——一元与多元线性回归模型

Python大数据分析——一元与多元线性回归模型 相关分析概念示例 一元线性回归模型概念理论分析函数示例 多元线性回归模型概念理论分析示例 线性回归模型的假设检验模型的F检验理论分析示例 模型的T检验理论分析示例 相关分析 概念 a 正相关&#xff1b;b 负相关&#xff1b;c…

基于ollama搭建本地chatGPT

ollama帮助我们可以快速在本地运行一个大模型&#xff0c;再整合一个可视化页面就能构建一个chatGPT&#xff0c;可视化页面我选择了chat-ollama&#xff08;因为它还能支持知识库&#xff0c;可玩性更高&#xff09;&#xff0c;如果只是为了聊天更推荐chatbox 部署步骤 下载…

【BMW】Bayerische Motoren Werke AG

文章目录 BMW 3系 X3X1、X2、奇瑞捷豹路虎、特斯拉ES200 vs BMW 325i M 运动曜夜Price历代宝马3系列 BMW 3系 X3 3 系参数 X1、X2、奇瑞捷豹路虎、特斯拉 ES200 vs BMW 325i M 运动曜夜 &#xff08;右到左看&#xff09; Price 2024.04.13 24年4月2&#xff0c;来自小…

【随笔】Git 基础篇 -- 远程与本地提交的差异 git clone(二十六)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

JVM—jps、jstat、jinfo、jmap、jstack的使用

JVM—jps、jstat、jinfo、jmap、jstack的使用 jps jps全称&#xff1a;Java Virtual Machine Process Status Tool 可以查看Java进程&#xff0c;相当于Linux下的ps命令&#xff0c;只不过它只列出Java进程。 jps:列出Jav程序ID和Main函数名称 jps -q:只输出进程ID jps -m …

故障诊断 | Matlab实现基于小波包结合卷积神经网络DWT-CNN实现电缆故障诊断算法

故障诊断 | Matlab实现基于小波包结合卷积神经网络DWT-CNN实现电缆故障诊断算法 目录 故障诊断 | Matlab实现基于小波包结合卷积神经网络DWT-CNN实现电缆故障诊断算法分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.Matlab实现基于小波包结合卷积神经网络DWT-CNN实现电…