算法: 位运算题目练习

news2024/11/24 16:10:07

文章目录

  • 位运算
    • 判定字符是否唯一
    • 丢失的数字
    • 两整数之和
    • 只出现一次的数字 II
    • 消失的两个数字
    • 常见位运算总结


位运算

判定字符是否唯一

在这里插入图片描述
有很多解法,比如hash表,或者给字符串排个序,然后遍历…

写这道题时没注意到如果出现奇数个相同字符,此时就应该返回false了.
而不是全部放到位图中,最后再判断…

应该在放进去的时候就进行判断~

    public boolean isUnique(String astr) {
        int n = astr.length();
        if(n > 26) {
            return false;
        }
        
        int bit = 0;
        for(int i = 0; i < n; i++) {
            int m = astr.charAt(i)-'a';
            if(((bit >> m) & 1) == 0) {
                bit ^= 1 << m;
            } else {
                return false;
            }

        }

        return true;
    }

丢失的数字

在这里插入图片描述
直接秒了~

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

        return sum;
    }

两整数之和

在这里插入图片描述

看这个讲解看懂了~ 两整数之和

    public int getSum(int a, int b) {
        while(b != 0) {
            // 进位
            int carry = (a & b) << 1;
            // 无符号相加
            a = a ^ b;

            // 最终结果 = carry(进位) + a(无符号相加结果) 
            // 因为不能使用 + ,所以再进入循环
            b = carry;
        }
        return a;
    }

只出现一次的数字 II

在这里插入图片描述
这个解法以前没见过,涨知识了~

这有个题解: 只出现一次的数字 II(有限状态自动机 + 位运算,清晰图解)

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

消失的两个数字

在这里插入图片描述
这道题跟 只出现一次的数字 III 差不多.

坑:

  • 找最后的结果时不仅要异或数组,还要异或 1 ~ n+2 的数字,如果想把这两个放到同一个循环内,那么要注意 它们俩的条件不同 !!
    public int[] missingTwo(int[] nums) {

        int sum = 0;
        int n = nums.length;
        for (int i = 0; i < n; i++) {
            sum ^= nums[i];
            sum ^= i + 1;
        }
        sum ^= n + 1;
        sum ^= n + 2;

        int p = sum & (-sum);
        int ret1 = 0;
        for (int i = 0; i < n; i++) {
            if ((nums[i] & p) == 0) {
                ret1 ^= nums[i];
            }
        }
        for (int i = 1; i <= n + 2; i++) {
            if ((i & p) == 0) {
                ret1 ^= i;
            }
        }
        int ret2 = sum ^ ret1;
        return new int[]{ret1, ret2};
    }

我找两个数的二进制的不同的那一位用的是 sum & (-sum)

题解用的跟我不一样,他是一位一位检查的~

    public int[] missingTwo(int[] nums) {

        int sum = 0;
        int n = nums.length;
        for (int i = 0; i < n; i++) {
            sum ^= nums[i];
            sum ^= i + 1;
        }
        sum ^= n + 1;
        sum ^= n + 2;

        int p = 0;
        while (true) {
            if (((sum >> p) & 1) == 1)
                break;
            else
                p++;
        }

        int ret1 = 0;
        for (int i = 0; i < n; i++) {
            if ((nums[i] & (1 << p)) == 0) {
                ret1 ^= nums[i];
            }
        }
        for (int i = 1; i <= n + 2; i++) {
            if ((i & (1 << p)) == 0) {
                ret1 ^= i;
            }
        }
        int ret2 = sum ^ ret1;
        return new int[]{ret1, ret2};
    }

常见位运算总结

  1. 基础位运算

    • << 左移
    • >> 右移
    • ~ 按位取反. 记忆方法: 0 变 1, 1 变 0.
    • & 按位与. 记忆方法: 有 0 就是 0.
    • | 按位或. 记忆方法: 有 1 就是 1.
    • ^ 按位异或. 记忆方法: 相同为0,相异为一. 无进位相加.
  2. 给一个数 n,确定它的二进制表示中的第 x 位是 0 还是 1.
    n = (n >> x) & 1

  3. 将一个数 n 的二进制表示中的第 x 位修改成 1.
    n = n | ( 1 << x )

  4. 将一个数 n 的二进制表示中的第 x 位修改成 0.
    n = n & ( ~ (1 << x) )

  5. 位图

  6. 提前一个数 n 的二进制表示中的最右侧的 1
    n & - n

    - n 的含义其实就是把 n 的二进制表示中的最右侧的 1 的左侧区域全部变成相反.
    我们都知道 - n = ~ n + 1
    在这里插入图片描述

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

    n - 1 其实是将 n 的二进制表示中的最右侧的 1 的右边区域(包括1) 全部变成相反
    在这里插入图片描述

  8. 位运算的优先级

    在使用时直接加括号,不要背优先级顺序 !!

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

    • a ^ 0 = a
    • a ^ a = 0 (消消乐)
    • a ^ b ^ c = a ^ (b ^ c)

练手题目:

  1. 位 1 的个数
  2. 比特位计数
  3. 汉明距离
  4. 只出现一次的数字
  5. 只出现一次的数字 III

本文到这里就结束啦~

在这里插入图片描述

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

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

相关文章

智慧高铁站的概念与优势

1. 概念介绍 智慧高铁站是指利用先进的信息技术和智能化手段&#xff0c;对高铁站的运营管理、服务功能、安全保障等方面进行全面升级和优化的现代化交通枢纽。通过数字化、网络化和智能化技术的应用&#xff0c;实现高铁站的智能化管理、便捷化服务和可持续发展&#xff0c;从…

【Linux】Linux进程基础

1.进程介绍与概念 进程的本质是在计算机内存中运⾏的程序&#xff0c;但是这⼀个概念太过于⼴泛 每个应用程序运行于现代操作系统之上时&#xff0c;操作系统会提供一种抽象&#xff0c;好像系统上只有这个程序在运行&#xff0c;所有的硬件资源都被这个程序在使用。这种假象…

ui自动化知识点-web端

UI &#xff1a; User Interface( ⽤户接⼝ - ⽤户界⾯ ) &#xff0c;主要包括&#xff1a; app 、 web ui ⾃动化测试&#xff1a;使⽤⼯具或代码执⾏⽤例的过程 什么样的项⽬适合做⾃动化&#xff1a;1、需要回归测试项⽬&#xff08;甲⽅⾃营项⽬、⾦融、电商&#xff09…

鸿蒙开发 三十七 ArkTs类 class 构造函数

语法格式如下&#xff1a; class 类名{ 字段1:类型 字段2:类型 constructor(参数...) { this.字段 参数 } } 实例化&#xff1a; const 实例1 new 类名(参数...&#xff09;每new一次就去执行一次constructor方法&#xff0c;创建不同的实例。 每次new都要传参数&…

MySQL学习笔记(持续更新,目前到十一章锁)

1、Mysql概述 1.1 数据库相关概念 三个概念&#xff1a;数据库、数据库管理系统、SQL 名称全称简称数据库存储数据的仓库&#xff0c;数据是有组织的进行存储DataBase&#xff08;DB&#xff09;数据库管理系统操纵和管理数据库的大型软件DataBase Mangement System&#xf…

C++ -string -常见用法1

博客主页&#xff1a;【夜泉_ly】 本文专栏&#xff1a;【C】 欢迎点赞&#x1f44d;收藏⭐关注❤️ 文章目录 &#x1f4a1;前言1.构造函数1.1函数原型1.2用法速览1.3详解() -重点⭐( s) -重点⭐( n, c) -重点⭐( str) -重点⭐( str, pos, len)( s, n) 2.容量函数2.1函数原型2…

github 上将 stable 合并到 master 分支步骤

本地仓库分支&#xff1a;origin 远端仓库分支&#xff1a;upstream 切到非 master 分支上&#xff0c;比如 dev # 本地操作 git branch -D master git fetch upstream master::master git checkout master # 这步是拉取远端 stable 到 master 上&#xff0c;可能会出错误 # fa…

21次惊艳亮相!凯特王妃的秋季时尚造型!在时尚领域她已经无限接近戴安娜王妃

虽然凯特米德尔顿正式成为英国王室成员才刚刚十多年&#xff0c;但很难想象没有她的王室会是什么样子。毕竟&#xff0c;凭借她非凡的风格和不可否认的魅力&#xff0c;威尔士王妃在2011年迅速赢得了我们以及全世界的喜爱。 我们都喜欢关注她的项目以及她和威廉王子的爱情故事…

基于STM32的智能电能表设计

引言 本项目设计了一个基于STM32的智能电能表&#xff0c;能够实时测量电压、电流、功率以及累计的电能消耗。通过ADC模块采集电压和电流信号&#xff0c;结合功率计算算法&#xff0c;系统可以精准地监控家庭或工业设备的电能消耗。该智能电能表还支持远程数据传输和本地数据…

Krea.ai正式发布AI视频集合站:Luma、Runway与可灵的深度整合

引言 在数字内容日益丰富的今天&#xff0c;视频制作的需求呈现爆发式增长。为了满足创作者对高效、创新视频工具的渴求&#xff0c;Krea.ai推出了全新的AI视频集合站。此平台整合了多款领先工具&#xff0c;如Luma、Runway、可灵和Minimax&#xff0c;为用户提供一站式的视频…

【等号绕过】

简介 一、大小于号绕过 上面的<>是不等于的意思 测试注入点&#xff1a; id1 正常输入id1 测试是否有注入id1 and 11%23 提示hacker~ 被过滤了id1 and 1%23 没有被过滤&#xff0c;说明是被过滤&#xff0c;但是没有输出id1 and 1%23 页面有输…

25四非网安保研回忆录(北航网安/东南网安/重大计科等)

目录 0 个人情况 1 夏令营 西南大学计科 西南交通大学计科 重庆大学计科 2 预推免 东南大学网安 北京航空航天大学网安 3 写在最后 0 个人情况 计算机类比较强的四非&#xff0c;信安专业rank1&#xff0c;六级540&#xff0c;竞赛十几个&#xff0c;无论文&#xff…

【Linux网络编程】网络基础 | Socket 编程基础

&#x1f308;个人主页&#xff1a; 南桥几晴秋 &#x1f308;C专栏&#xff1a; 南桥谈C &#x1f308;C语言专栏&#xff1a; C语言学习系列 &#x1f308;Linux学习专栏&#xff1a; 南桥谈Linux &#x1f308;数据结构学习专栏&#xff1a; 数据结构杂谈 &#x1f308;数据…

2.13寸电子墨水屏HINK-E0213+esp8266

记录好数字 2.13寸电子墨水屏HINK-E0213esp8266 声明:大部分资料来源于微雪电子http://微雪电子-官网 https://www.waveshare.net/ 前言 很久以前买的一块电子墨水屏,运气很好,这个型号HINK-E0213资料很全,而且微雪官网也有相关电路资料http://2.13inch e-Paper HAT - Waves…

java邮件发送

文章目录 前言一、开启SMTP邮箱配置二、spring-mail1.引入依赖2.yml配置3.使用二、hutool-mail1.引入hutool2.在resource下新增mail.setting3.使用总结前言 发送邮件: 目前比较简单的有两种方式实现: spring-mailhuool-mail现在看下两种方式 一、开启SMTP邮箱配置 两种方式…

mysql查询2张表连接列名一样的情况

people表&#xff1a; person表&#xff1a; SELECT * FROM person LEFT JOIN people on people.idperson.id 查询的结果id(1)和name(1)说明列名重复 SELECT person.id,person.name,people.id as pid,people.name as pname FROM person LEFT JOIN people on people.idperso…

Linux shellcheck工具

安装工具 通过linux yum源下载&#xff0c;可能因为yum源的问题找不到软件包&#xff0c;或者下载的软件包版本太旧。 ShellCheck的源代码托管在GitHub上(推荐下载方式)&#xff1a; GitHub - koalaman/shellcheck: ShellCheck, a static analysis tool for shell scripts 对下…

10.高级存储过程技巧(10/10)

高级存储过程技巧博客大纲 引言 在现代数据库管理系统中&#xff0c;存储过程作为提升数据操作效率和安全性的关键工具&#xff0c;已被广泛应用于各种数据库操作中。存储过程是一组为了完成特定功能的SQL语句集合&#xff0c;这些语句在数据库中被保存、编译和优化&#xff0…

Chromium 前端window对象c++实现定义

前端中window.document window.alert()等一些列方法和对象在c对应定义如下&#xff1a; 1、window对象接口定义文件window.idl third_party\blink\renderer\core\frame\window.idl // https://html.spec.whatwg.org/C/#the-window-object// FIXME: explain all uses of [Cros…

【原创】java+springboot+mysql在线课程学习网设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…