算法: 位运算题目练习

文章目录

  • 位运算
    • 判定字符是否唯一
    • 丢失的数字
    • 两整数之和
    • 只出现一次的数字 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

本文到这里就结束啦~

在这里插入图片描述

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

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

相关文章

### 更新数据库时出错。原因:java.sql.SQLException: No database selected

更新数据库时出错。原因&#xff1a;java.sql.SQLException: No database selected 问题&#xff1a;原因&#xff1a;解决办法&#xff1a; 问题&#xff1a; 在基于idea环境中学习搭建mybatis框架时&#xff0c;MySQL数据库执行插入语句遇到以下异常&#xff1a; com.intel…

SMARTFORMS 可选项CONDITION设置条件,根据条件真假显示不一样的内容

文章目录 开发过程执行测试是否输出 开发过程 执行测试 是否输出

前端开发攻略---使用ocr识别图片进行文字提取功能

1、引入资源 通过链接引用 <script src"https://cdn.bootcdn.net/ajax/libs/tesseract.js/5.1.0/tesseract.min.js"></script> npm或其他方式下载 npm i tesseract 2、示例 <!DOCTYPE html> <html lang"en"><head><meta…

PHP智慧餐饮新风尚点餐系统

智慧餐饮新风尚点餐系统 —— 美食与科技的完美碰撞 &#x1f37d;️ 开篇&#xff1a;智慧餐饮的崛起 在快节奏的现代生活中&#xff0c;智慧餐饮正逐渐成为我们日常的一部分。随着科技的飞速发展&#xff0c;餐饮行业也在不断创新&#xff0c;力求为顾客提供更加便捷、高效…

如何微调(Fine-tuning)大语言模型?

从 GPT3 到 ChatGPT、从GPT4 到 GitHub copilot的过程&#xff0c;微调在其中扮演了重要角色。什么是微调&#xff08;fine-tuning&#xff09;&#xff1f;微调能解决什么问题&#xff1f;什么是 LoRA&#xff1f;如何进行微调&#xff1f; 本文将解答以上问题&#xff0c;并…

Go语言基础学习(Go安装配置、基础语法)

一、简介及安装教程 1、为什么学习Go&#xff1f; 简单好记的关键词和语法&#xff1b;更高的效率&#xff1b;生态强大&#xff1b;语法检查严格&#xff0c;安全性高&#xff1b;严格的依赖管理&#xff0c; go mod 命令&#xff1b;强大的编译检查、严格的编码规范和完整的…

数据库的相关知识

数据库的相关知识 1.数据库能够做什么&#xff1f; 存储大量数据&#xff0c;方便检索和访问保持数据信息的一致、完整共享和安全通过组合分析&#xff0c;产生新的有用信息 2.数据库作用&#xff1f; 存储数据、检索数据、生成新的数据 3.数据库要求&#xff1f; 统一、…

leetcode128最长连续序列 golang版

题目描述 题目&#xff1a;给定一个未排序的整数数组 nums 找出数字连续的最长序列&#xff0c;不要求序列 元素在原数组中连续 的长度 请你设计并实现时间复杂度为On的算法解决此问题 示例 1&#xff1a; 输入&#xff1a;nums [100,4,200,1,3,2] 输出&#xff1a;4 解释&…

基于RPA+AI的网页自动填写机器人 | OPENAIGC开发者大赛高校组优秀作品

在第二届拯救者杯OPENAIGC开发者大赛中&#xff0c;涌现出一批技术突出、创意卓越的作品。为了让这些优秀项目被更多人看到&#xff0c;我们特意开设了优秀作品报道专栏&#xff0c;旨在展示其独特之处和开发者的精彩故事。 无论您是技术专家还是爱好者&#xff0c;希望能带给…

软件设计师---知识产权

著作权 著作权&#xff08;也称为版权&#xff09;&#xff1a;是指作者对其创作的作品享有的人身权和财产权。 人身权包括&#xff1a; 发表权&#xff1a;时限是作者终身及其死亡后50年署名权&#xff1a;不受时间限制修改权&#xff1a;不受时间限制保护作品完整权&#…

MFC扩展库BCGControlBar Pro v35.1新版亮点:改进网格控件性能

BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。 我们的组件可以轻松地集成到您的应用程序中&#xff0c;并为您节省数百个开发和调试时间。 BCGControlBar专业版 v35.1已全新发布了&#xff0c;这个版本改进网格控件的性能、增强工具栏编辑器功能等。 …

Android 防止截屏和录屏

通过给当前的window对象设置标记WindowManager.LayoutParams.FLAG_SECURE来防止截屏和录屏 protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 防止截屏getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManage…

en造数据结构与算法C# 之 堆排序

堆的特点 堆排序有两个分类&#xff1a;大顶堆&#xff0c;小顶堆 比如大顶堆就是说所有根节点的值都比左右子节点大 en造数据结构与算法C# 二叉排序树 泛型类的基本构成-CSDN博客 en造数据结构与算法C# 之 二叉排序树的增/查-CSDN博客 en造数据结构与算法C# 之 二叉排序…

使用激光跟踪仪提升码垛机器人精度

标题1.背景 码垛机器人是一种用于工业自动化的机器人&#xff0c;专门设计用来将物品按照一定的顺序和结构堆叠起来&#xff0c;通常用于仓库、物流中心和生产线上&#xff0c;它们可以自动执行重复的、高强度的搬运和堆垛任务。 图1 码垛机器人 传统调整码垛机器人的方法&a…

Qt - QMenu

QMenu 1、menu转string输出 //GlobalEnum.h #include <QObject> #include <QMetaEnum> class GlobalEnum : public QObject {Q_OBJECT public:EnumTest();enum Enum_Test{ZhangSan 0,WangWu,};Q_ENUM(Enum_Test) };#define EnumToString(e) \ QMetaEnum::fromTy…

前端vue部署网站

这里讲解一下前端vue框架部署网站&#xff0c;使用工具是 xshell 和 xftp &#xff08;大家去官网安装免费版的就行了&#xff09; 服务器 我使用的阿里云服务器&#xff0c;买的是 99 一年的&#xff0c;淘宝有新手9.9 一个月服务器。可以去用&#xff0c;学生的话是有免费三…

【优选算法】(第三十六篇)

目录 ⼆叉树的锯⻮形层序遍历&#xff08;medium&#xff09; 题目解析 讲解算法原理 编写代码 ⼆叉树的最⼤宽度&#xff08;medium&#xff09; 题目解析 讲解算法原理 编写代码 ⼆叉树的锯⻮形层序遍历&#xff08;medium&#xff09; 题目解析 1.题目链接&#xf…

zabbix7.0配置中文界面

Zabbix 是一个广泛使用的开源监控解决方案&#xff0c;支持多种语言界面。本文将详细介绍如何配置 Zabbix 以使用中文界面&#xff0c;从而提高用户体验和可读性。 1. 环境准备 在开始配置之前&#xff0c;请确保你已经安装并运行了 Zabbix 服务器、前端和数据库。如果你还没有…

c++中,经常需要用来获取用户输入的写法,或者暂停【防止终端退出】

目录 1. 使用 cin.get() 暂停程序 2. 使用 std::cin.ignore() 结合 std::cin.get() 暂停程序 3. 使用 system("pause")&#xff08;仅限 Windows&#xff09; 4. 使用循环和 cin.get() 结合等待任意输入 5. 使用 cin >> 获取用户输入 为了防止终端窗口在程…

亚信安全亮相中国移动全球合作伙伴大会 AI+安全焕新变革原力

近日&#xff0c;2024中国移动全球合作伙伴大会在广州盛大召开。以“智焕新生 共创AI时代”为主题&#xff0c;携手数百位世界500强企业、国内外知名企业齐聚广州&#xff0c;共商融合创新&#xff0c;共谋AI未来&#xff0c;开启中国式现代化建设的新征程。亚信安全作为中国移…