基础算法(5)——位运算

news2024/11/25 20:49:14

1. 常见位运算总结

1) 基础位运算


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


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


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


5) 位图的思想

位图的本质就是 哈希表


6) 提取一个数 n 二进制表示中最右侧的 1(lowbit)


7) 干掉一个数 n 二进制表示中最右侧的 1

例题:

191. 位1的个数 - 力扣(LeetCode)

338. 比特位计数 - 力扣(LeetCode)

461. 汉明距离 - 力扣(LeetCode)


8) 位运算的优先级

位运算符太多了,容易记混,所以不记了,能加括号就加括号


9) 异或(^)运算的运算律

例题:

136. 只出现一次的数字 - 力扣(LeetCode)


2. 判定字符是否唯一

题目描述:

解法一:数组模拟哈希表

代码实现:

class Solution {
    public boolean isUnique(String astr) {
        int n = astr.length();
        if (n > 26) return false; //字符串仅包含小写字母
        char[] arr = astr.toCharArray();
        int[] ret = new int[26];
        for (int i = 0; i < n; i++) {
            ret[arr[i] - 'a']++;
            if (ret[arr[i] - 'a'] > 1) {
                return false;
            }
        }
        return true;
    }
}

解法二:位图

代码实现:

class Solution {
    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;
    }
}

3. 丢失的数字

题目描述:

解法一:哈希表

//哈希表
class Solution {
    public int missingNumber(int[] nums) {
        int n = nums.length;
        int[] hash = new int[n + 1];
        for (int i = 0; i < n; i++) {
            hash[nums[i]]++;
        }
        for (int i = 0; i < hash.length; i++) {
            if (hash[i] == 0) {
                return i;
            }
        }
        return -1;
    }
}

解法二:高斯求和

//高斯求和
class Solution {
    public int missingNumber(int[] nums) {
        int n = nums.length;
        int sum1 = 0;
        int sum2 = 0;
        for (int i = 0; i < n; i++) {
            sum1 += nums[i];
        }
        for (int i = 0; i <= n; i++) {
            sum2 += i;
        }
        return sum2 - sum1;
    }
}

解法三:位运算(异或运算的运算律)

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

4. 两整数之和

题目描述:

解法:位运算(异或运算 - 无进位相加)

算法思路:

代码实现:

class Solution {
    public int getSum(int a, int b) {
        while (b != 0) {
            int x = a ^ b; // 计算无进位相加的结果
            int y = (a & b) << 1; // 计算进位
            a = x;
            b = y;
        }
        return a;
    }
}

5. 只出现一次的数字 II

题目描述:

解法:利用位运算依次确定每一个二进制位

代码实现:

class Solution {
    public int singleNumber(int[] nums) {
        int ret = 0;
        for (int i = 0; i < 32; i++) { // 依次修改 ret 中的每一个比特位
            int sum = 0;
            for (int x : nums) { // 统计 nums 中所有的数的第 i 位二进制的和
                if (((x >> i) & 1) == 1) {
                    sum++;
                }
            }
            sum %= 3;
            if (sum == 1) ret |= (1 << i); // 将ret 的第 i 位二进制修改为 1
        }
        return ret;
    }
}

6. 只出现一次的数字III

题目描述:

算法思路:

是下面 7 题的思路的一部分

代码实现:

class Solution {
    public int[] singleNumber(int[] nums) {
        // 1. 找到 a ^ b
        int tmp = 0;
        for (int x : nums) {
            tmp ^= x;
        }

        // 2. 找到 tmp 二进制位中最右侧为 1 的位置
        int diff = 0;
        while (true) {
            if (((tmp >> diff) & 1) == 1) {
                break;
            }
            diff++;
        }

        //  3. 按照 diff 位置为1或0,将数组分为两类分别异或
        int[] ret = new int[2];
        for (int x : nums) {
            if (((x >> diff) & 1) == 1) {
                ret[0] ^= x;
            } else {
                ret[1] ^= x;
            }
        }
        return ret;
    }
}

7. 消失的两个数字

题目描述:

算法思路:

结合 268. 丢失的数字 和 260. 只出现一次的数字 III 两题

代码实现:

class Solution {
    public int[] missingTwo(int[] nums) {
        int n = nums.length;

        // 1. 先把所有数异或在一起
        int tmp = nums[0];
        for (int i = 1; i < n; i++) {
            tmp ^= nums[i];
        }
        for (int i = 0; i <= n + 2; i++) { // 注:此处为 <=
            tmp ^= i;
        }

        // 2. 找到 a,b 两个数比特位不同的位置
        int x = -1; // 使用 x 记录该位置
        for (int i = 0; i < 32; i++) {
            if (((tmp >> i) & 1) == 1) {
                x = i;
                break;
            }
        }

        // 3. 将所有的数按照 x 位置是0还是1,分为两类异或
        int[] ret = new int[2];
        for (int i : nums) {
            if (((i >> x) & 1) == 1) ret[0] ^= i;
            else ret[1] ^= i;
        }
        for (int i = 1; i <= n + 2; i++) {
            if (((i >> x) & 1) == 1) ret[0] ^= i;
            else ret[1] ^= i;
        }
        return ret;
    }
}

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

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

相关文章

如 有 任 何 问 题 ,请 及 时 联 系 我 们 反 馈 !

如有任何问题&#xff0c; 请及时联系我们反馈 !https://support.qq.com/products/671606 如有任何问题&#xff0c; 请及时联系我们反馈 !

Bluetooth Channel Sounding中关于CS Procedure的详细介绍

目录 BLE CS 过程定义&#xff1a; BLE CS 过程的组成部分 开始一个BLE CS 过程 与BLE CS过程相关的参数设置 BLE CS 过程定义&#xff1a; BLE 的CS特性包含一组LL层和空口协议的组合过程&#xff0c;该过程可以使得两个BLE 设备以紧密互锁的方式&#xff0c;在多个信道上…

Ubuntu 上安装 MySQL 并且实现远程登录

目录 1. 安装MySQL 2. 安全配置MySQL 3. 配置MySQL远程登录 3.1. 允许远程连接 3.2. 重启MySQL服务 3.3. 为用户分配远程访问权限 进入MySQL后&#xff0c;执行以下命令&#xff1a; 3.4. 创建新用户 3.5. 授予权限 3.6. 刷新权限 3.7. 退出 MySQL 控制台 4. 配置防火…

2024.9月29日~10月6日 SSM框架项目-《电信资费管理系统》

一、数据库介绍&#xff1a; 1、account&#xff1a;帐务信息表 2、admin_info&#xff1a;管理员信息表 3、admin_role&#xff1a;管理员角色信息表 4、cost&#xff1a;资费信息表 5、privilege_info&#xff1a;权限信息表 6、role_info&#xff1a;角色信息表 7、role_pri…

在CentOS7上安装mysql

目录 1.下载安装文件 2.上传到CentOS7上 3.解压MySQL文件 4.清理系统中残留的MySQL 5.安装MySQL 6.启动MySQL 并 设置开机自启动 7.查找临时密码&#xff0c;并修改密码 注意&#xff1a; 教程&#xff1a;在Linux上安装mysql&#xff08;超详细版&#xff09;_哔哩哔哩…

人工智能新闻和发展 (24001)- By 10/4/2024

1. 谷歌增强了搜索中的人工智能&#xff0c;允许对图像进行语音提问。 Google adding AI to answer voiced questions about images | AP NewsGoogle is pumping more artificial intelligence into its search engine. New features will enable people to voice questions a…

[C#]使用onnxruntime部署yolov11-onnx实例分割模型

【官方框架地址】 https://github.com/ultralytics/ultralytics.git 【算法介绍】 在C#中使用ONNX Runtime部署YOLOv11-ONNX实例分割模型&#xff0c;涉及到模型的加载、数据预处理、模型推理和后处理几个关键步骤。 首先&#xff0c;需要确保已经安装了ONNX Runtime的NuGe…

【数据结构】【链表代码】随机链表的复制

/*** Definition for a Node.* struct Node {* int val;* struct Node *next;* struct Node *random;* };*/typedef struct Node Node; struct Node* copyRandomList(struct Node* head) {if(headNULL)return NULL;//1.拷贝结点&#xff0c;连接到原结点的后面Node…

[Linux] 进程创建、退出和等待

标题&#xff1a;[Linux] 进程创建、退出和等待 个人主页水墨不写bug &#xff08;图片来源于AI&#xff09; 目录 一、进程创建fork&#xff08;&#xff09; 1&#xff09; fork的返回值&#xff1a; 2&#xff09;写时拷贝 ​编辑3&#xff09;fork常规用法 4&#xff…

目标侦测划分数据集代码--->voc

代码如下&#xff1a; import glob import os import random import shutil # 划分比例 p3/4#训练集 xmlpathE:\\shujuji\\MASK\\Annotations\\* imgpathE:\\shujuji\\MASK\\JPEGImages\\* xmlpathsglob.glob(xmlpath) imgpathsglob.glob(imgpath) my_list[i for i in range(l…

MATLAB图像去雾系统

应用背景 现在工业发展迅速&#xff0c;产生的废气很严重&#xff0c;导致雾霾厉害&#xff0c;现在虽然有硬件来拍摄&#xff0c;可以清晰化视野&#xff0c;但是硬件成本昂贵&#xff0c;急需寻求一种算法来帮助雾霾的清晰处理。显得经济。 采用算法原理 本文采用全局直方…

走进异常类的世界,自定义业务异常类实现指南

接下来这篇文章&#xff0c;小编将带领大家走进异常类的世界&#xff0c;探索异常类的奥秘。 引言 学习Java异常类&#xff0c;需掌握其基础概念&#xff0c;如try-catch语句、throw与throws关键字。通过实例理解异常层次结构&#xff0c;区分已检查与未检查异常。实践编写自定…

springboot文件上传(阿里云oss)

本地存储 使用uuid是为了避免文件名的重复&#xff0c;防止覆盖 RestController public class FIleUploadController {PostMapping("/upload")public Result<String> upload(MultipartFile file) throws IOException {//把文件的内容存储到本地磁盘上String …

基于SpringBoot+Vue的在线投票系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

C++的STL标准模版库容器--list类

前言 list(双向链表)类属于STL标准模版库容器模块&#xff0c;它的迭代器是双向迭代器&#xff0c;也比较好理解&#xff0c;它申请空间不是一次申请一块空间而是每一个节点各自独立的空间&#xff0c;它不再能够支持随机访问和[]&#xff0c;如果想要和string类容器或者vecto…

集合源码1

一、List接口分析 1、list接口的特点 ①List集合的所有元素是由一种线性方式进行存储的。 ②它是一个元素存储有序的集合。即元素的存入顺序和取出顺序有保证。 ③他是一个带有索引的集合&#xff0c;通过索引就可以精确的操作集合中的元素 ④集合中可以有重复的元素&#xff0…

二分查找算法——寻找旋转排序数组中的最小值点名

1.题目解析 题目来源&#xff1a;LCR173.点名——力扣 原名&#xff1a;剑指offer——0~n-1中消失的数字 测试用例 题目来源&#xff1a;153.寻找旋转排序数组中的最小值——力扣 测试用例 2.算法原理 点名 如果要寻找消失的数字&#xff0c;可以判断对应下标的数字是否和下标对…

视觉定位Revisit Anything

Revisit Anything: Visual Place Recognition via Image Segment Retrieval 项目地址 摘要&#xff1a; 准确识别重游地点对于嵌入代理的定位和导航至关重要。这要求视觉表现清晰&#xff0c;尽管摄像机视点和场景外观有很大变化。现有的视觉地点识别管道对“整个”图像进行编码…

制作离线版Koczkatamas工具包

一、下载源码 从https://github.com/koczkatamas/koczkatamas.github.io下载koczkatamas.github.io-master.zip 二、解压 $ unzip koczkatamas.github.io-master.zip三、运行index.html 可以看到输入一个字符后&#xff0c;下面的各种编码都没有显示&#xff0c;则表示运行…

【玩转 JS 函数式编程_008】3.1.2 JavaScript 函数式编程筑基之:箭头函数——一种更流行的写法

文章目录 3.1.2 箭头函数——更流行的方式 Arrow functions - the modern way1. 返回值 Returning values2. this 值的处理 Handling the this value3. arguments 的处理 Working with arguments4. 单参数还是多参数&#xff1f; One argument or many? 写在前面 故天将降大任…