【基础算法总结】位运算

位运算

  • 1.基础位运算
  • 2.常见用法总结
  • 3.面试题 01.01. 判定字符是否唯一
  • 4.丢失的数字
  • 5.两整数之和
  • 6.只出现一次的数字 II
  • 7.面试题 17.19. 消失的两个数字

在这里插入图片描述

点赞👍👍收藏🌟🌟关注💖💖
你的支持是对我最大的鼓励,我们一起努力吧!😃😃

1.基础位运算

<<、>>、~、&、| 、^

& : 全为1才为1
| :有1就是1
^ :相同为0,相异为1。 或者无进位相加(不进位)

在这里插入图片描述

2.常见用法总结

1.位运算的优先级
能加括号的就加括号

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

在这里插入图片描述
3.将一个数 n 的二进制表示的第 x 位修改成1

在这里插入图片描述
4. 将一个数 n 的二进制位表示的第 x 位修改成0

在这里插入图片描述
5.位图思想
位图主要借鉴哈希表的思想,哈希表是一个数组或者是一个数组里放链表但不管怎么用都是都一个类型。如果让存42亿个数肯定存不下,这个时候就要用位图了,最小消耗检查一个数据在不在,用比特位,1表示在,0表示不在。

6.提取一个数 n 二进制表示中最右侧的1 (lowbit)
在这里插入图片描述
n&(-n)
-n:将最右侧1,左边的区域全部变成相反

在这里插入图片描述
7.干掉一个数 n 二进制表示中最右侧的 1

n&(n-1)
n-1:将最右侧的1,右边区域(包括自己)全部变成相反

在这里插入图片描述
8.异或(^)运算的运算率

在这里插入图片描述

3.面试题 01.01. 判定字符是否唯一

题目链接:面试题 01.01. 判定字符是否唯一

题目描述:

在这里插入图片描述

算法原理:

找一个数在不在第一时间应该想到的哈希表,这道题要求不适用额外的数据结构,并且字母都是小写的,因此自己可以写一个int hash[26],将字符一一相对映射。

解法一:哈希表

但是我们还可以更节省空间,记得C++学过的位图,它仅需一个比特位就可以判断一个数到底在不在,每个比特位有两种状态,1表示在,0表示不在
,并且这个范围仅有26个字母,一个int类型完全就够了,因此更节省空间
在这里插入图片描述

当然这里还用一个优化:鸽巢原理,假设就n个鸽巢,来了n+1个鸽子,那一定有一个鸽巢是有两只鸽子的。这里也是假设26个字母不重复,但是如果有27个字母那一定有重复!

class Solution {
public:
    bool isUnique(string astr) {

        // 利用鸽巢原理做优化
        if(astr.size()>26) return false;

        // 位图
        int bitmp=0;
        for(auto& ch:astr)
        {
            int i=ch-'a';
            //字符没出现就加入到位图
            if((bitmp & (1<<i)) == 0) 
                bitmp|=(1<<i);
            else 
                return false;//出现就返回
        }
        return true;
    }
};

4.丢失的数字

题目链接:268. 丢失的数字

题目描述:

在这里插入图片描述

0~n 应该是n+1个数,但现在只有n个数,肯定是缺了一个。我们要找的就是那个缺的数

算法原理:

解法一:排序+遍历

说到排序还有一种方法,排序之后发现二段性,左边数字和下标对应,右边数字和下标不对应并且右边区域最左端点就是缺少的数字,因此使用二分查找。
在这里插入图片描述
解法二:二分查找

上面的时间复杂度比下面高

解法三:哈希
在这里插入图片描述

解法四:高斯求和公式
在这里插入图片描述

解法五:位运算(异或运算的运算律)
将数组和下面0-n异或,最后一定是缺失的数字。
在这里插入图片描述
做法可以是数组里面先异或然后再和0~n异或,或者是数组和下标异或然后和n异或。

class Solution {
public:
    int missingNumber(vector<int>& nums) {

        int ret=0;
        //for(auto e:nums) ret^=e;
        //for(int i=0;i<=nums.size();++i) ret^=i;
        //return ret;
        for(int i=0;i<nums.size();++i)
        {
            ret^=nums[i]^i;
        }
        return ret^=nums.size();
    }
};

5.两整数之和

题目链接:371. 两整数之和

题目描述:

在这里插入图片描述

算法原理:

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

异或运算就是一个无进位相加的结果
在这里插入图片描述
如果我们在能把进制位加上不就是最终结果了吗。

在这里插入图片描述

我们的进位是要加到这个无进制位结果的不就是结果了吗,但是这里要求不能使用+号,因此我们要重复上面的工作,因为上面不就是a+b吗

在这里插入图片描述

class Solution {
public:
    int getSum(int a, int b) {

        while(b!=0)
        {
            int x=a^b;//先算出无进制位相加结果
            int array=(a&b)<<1;//算出进位
            a=x;
            b=array;
        }
        return a;
    }
};

6.只出现一次的数字 II

题目链接:137. 只出现一次的数字 II

题目描述:

在这里插入图片描述

算法原理:

如果不限制空间 可以使用计数排序。也可以用一个排序算法然后再遍历找一个只出现一次的数。但是这里限制空间了。时间O(N),空间O(1)。

解法:位运算

计算出单个数字的二进制每一位是多少。
由于其他数字出现3次且对应每个二进制位都是相等的,要不全0要不全1,把这些出现3次的比特位加起来肯定是3的倍数。要不就是3n个0,要不就是 3n个1。而单个数字的对应的二进制位要不是0要不是1。所以把所有元素对应的二进制位加起来再对3取余,就可以确定单个数字,对应每个二进制位是0还是1了。

在这里插入图片描述
并且这种做法还可以扩展求其余出现n次,抓出现一次的数。只要%n就可以了
在这里插入图片描述

class Solution {
public:
	int singleNumber(vector<int>& nums) {
	    int ret=0;
        for(int i=0;i<32;++i)
        {
            int sum=0;
            for(auto x:nums)
                if(((x>>i)&1) == 1)
                    ++sum;
            sum%=3;
            if(sum == 1) ret|=(1<<i);
        }
        return ret;
    }
};

7.面试题 17.19. 消失的两个数字

题目链接:面试题 17.19. 消失的两个数字

题目描述:

在这里插入图片描述
一个数组消失了两个数字,原本是1~3 就剩下1了 ,原本1~4就剩下2,3了。

算法原理:
前面做过 丢失数字+只出现一次数字的||| 把它俩结合起来,这道题就非常容易了

首先利用丢失数字的思想来一个1~n的数组(包含丢失两个数的数组),然后将nums和这个数组放在一块,其他数字出现两次,还有两个数字只出现一次。让找出现一次的两个数组,这就转换成只出现一次数字||| 了。

在这里插入图片描述

解法:位运算

1.将所有的数异或在一起,tmp

2.找到tmp中,比特位为1 的那一位

因为a和b是不同的数,因此绝对可以找到tmp比特位为1的位置,因为异或只有相异为1,也就说明a和b该比特位是不同的,一个为0,一个为1.

3.根据 找到该比特位 x 的不同,将所有数划分成两类,然后在分别异或

在这里插入图片描述

class Solution {
public:
    vector<int> missingTwo(vector<int>& nums) {

        // 1.将所有的数异或在一起
        int tmp=0;
        for(auto x:nums) tmp^=x;     
        for(int i=1;i<=nums.size()+2;++i) tmp^=i;

        // 2.找出 a,b 中比特位不同的哪一位
        //这里找的是最右侧比特位出现1的位置,也可以遍历去找
        int bit=tmp&(-tmp);

        // 3.根据 该比特位不同,将所有的数划分两类来异或
        int a=0,b=0;
        for(auto x:nums)
            if((x&bit) == 0) a^=x;
            else b^=x; 

        for(int i=1;i<=nums.size()+2;++i)
            if((i&bit) == 0) a^=i;
            else b^=i;

        return {a,b};
    }
};

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

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

相关文章

基于物理的分析模型,用于具有场板结构的GaN HEMT的输入、输出及反向电容

Physics-Based Analytical Model for Input, Output, and Reverse Capacitance of a GaN HEMT With the Field-Plate Structure&#xff08;TPE 17年&#xff09; 摘要 该论文提出了一种分析模型&#xff0c;用于描述带有场板结构的常开型AlGaN/GaN高电子迁移率晶体管&#x…

无意间看到男主眼神,这也太有感觉了吧❗❗

2025即将首播《藏海传》中国大陆剧情/奇幻/古装共40集。 原本&#xff0c;稚奴身为大雍国钦天监监正蒯铎之子&#xff0c;背负着家族血仇。 历经十年沉默与磨砺&#xff0c;他化名为藏海&#xff08;肖战 饰&#xff09;&#xff0c;重返京城。 他凭借卓越的营造技艺和深谙纵…

深入探讨 Android 的 View 显示过程与源码分析

文章目录 1. 探讨 Android 的 View 显示过程1.1. onFinishInflate1.2. onAttachedToWindow1.3. onMeasure1.4. onSizeChanged1.5. onLayout1.6. onDraw 2. 系统代码分析1.1. onFinishInflate1.2. onAttachedToWindow1.3. onMeasure1.4. onSizeChanged1.5. onLayout1.6. onDraw …

Python网页处理与爬虫实战:使用Requests库进行网页数据抓取

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

LDR6328Q:重塑Type-C接口取电体验的新星

在当今日益发展的电子设备市场中&#xff0c;快速、高效的电源管理成为了众多厂商和消费者关注的焦点。LDR6328Q作为一款专为设备端设计的Type-C接口取电芯片&#xff0c;凭借其独特的功能和优势&#xff0c;正在逐步改变我们的电源管理方式。 一、LDR6328Q的核心特点 多协议…

高磷废酸除铝除铁再生技术的实际应用

在化工和金属加工行业中&#xff0c;高磷废酸的处理和再生是一个重要的环保和经济效益问题。废酸中通常含有铝、铁等杂质&#xff0c;这些杂质不仅影响废酸的再利用价值&#xff0c;还可能对环境造成污染。因此&#xff0c;开发高效的高磷废酸除铝除铁再生技术具有重要的实际意…

[排序算法]插入排序+希尔排序全梳理!

目录 1.排序是什么&#xff1f;1.1排序的概念1.2排序运用1.3常见的排序算法 2.插入排序分类3.直接插入排序基本思想具体步骤&#xff1a;动图演示代码实现直接插入排序的特性总结&#xff1a; 4. 希尔排序基本思想具体步骤动图演示代码实现希尔排序的特性总结&#xff1a; 5.总…

阿里云CDN流量被盗刷或CC攻击会怎么样?

最近&#xff0c;一位使用了阿里云CDN的站长向主机吧反应&#xff0c;其域名使用的阿里云CDN不知道是因为被盗刷还是被CC攻击&#xff0c;导致不仅原本帐号上的3T流量包用完了&#xff0c;连帐户也欠了几百元的流量费。 而产生这么多流量的只是晚上睡一觉起来&#xff0c;手机…

全志H616 通过Cedrus和v4l2_request API实现硬件编解码加速(香橙派zero2)

编译安装或加载cedrus驱动模块&#xff0c;加载v4l2-mem2mem Sunxi-Cedrus 致力于为全志 SoC 提供硬件加速的视频解码和编码支持&#xff0c;并将其引入主线 Linux 内核。此外&#xff0c;还为典型的基于 GNU/Linux 的系统提供了与内核驱动程序接口的其他用户空间组件。 Sunx…

调节效应多元统计回归

什么是调节效应&#xff0c;给个例子说明一下: 背景 假设我们有一个国家的经济数据&#xff0c;我们希望研究产业数字化是否调节了环境规制对产业结构调整的影响。 步骤 1. 假设检验 原假设 (H0)&#xff1a; 产业数字化对环境规制与产业结构调整之间的关系没有调节作用。…

浏览器提示413 Request Entity Too Large

1 问题 2 解决 2.1 后端java配置 2.2 Nginx配置

【Git篇 二】idea中使用git合并分支(拉取分支)

idea中使用git合并分支 前言idea使用git合并分支1) 将主分支&#xff08;master&#xff09;更新到自己的分支&#xff08;dev&#xff09;① checkout到自己分支② 目标分支&#xff08;dev&#xff09;更新到当前分支&#xff08;dev_KC240524&#xff09;③ 当前分支出现“绿…

提升B端图表设计技能:教程分享

图表是数据可视化的常用表现形式&#xff0c;是对数据的二次加工&#xff0c;可以帮助我们理解数据、洞悉数据背后的真相&#xff0c;让我们更好地适应这个数据驱动的世界。本期就来带大家学习图表的设计及构成&#xff0c;帮助大家更好的理解图表设计。 设计教程源文件http:/…

Keras深度学习框架实战(1):图像分类识别

1、绪论 1.1 图像分类的定义 图像分类是计算机视觉领域中的一项基本任务&#xff0c;其定义是将输入图像分配给预定义类别中的一个或多个。具体来说&#xff0c;图像分类系统接受一个图像作为输入&#xff0c;并输出一个或多个类别标签&#xff0c;这些标签描述了图像中的内容…

华为设备RIP基础路由实验

华为设备RIP基础路由实验 实验拓扑&#xff1a; RIP&#xff1a;距离矢量的动态路由&#xff0c;路由通信有方向&#xff0c;度量值metric取值范围&#xff08;1-16&#xff09;16表示目标主机不可达。 路由的版本分为&#xff1a;RIPV1&#xff08;广播通信目标地址是255.255…

Mysql树形结构递归查询

Mysql树形结构递归查询 1.表的基础数据2.基础查询语句3.Mysql8递归查询 1.表的基础数据 类似于这种三级目录&#xff1a; – 1&#xff1a;根结点 – 1-1至1-11 – 1-1-1 至1-1-10 2.基础查询语句 可以使用内联查询inner join去查询&#xff1a; SELECTone.id o…

如何做好流程优化?看这里的目的、原则和方法

流程管理的本质是通过构造卓越的业务流程让流程增值&#xff0c;为客户创造真正的价值。 但卓越的业务流程并不是一蹴而就的&#xff0c;有一个过程&#xff0c;这个过程就是业务流程和流程管理体系不断优化提升的过程&#xff08;可以参照流程成熟度评价模型&#xff09;。 …

React组件通信——兄弟组件

兄弟组件通信 方法一&#xff1a;状态提升 子组件先将数据传递到父组件&#xff0c;父组件再把数据传到另一个子组件中。 import { useState } from "react"; // 定义A组件&#xff0c;向B组件发送数据 function A({ onGetMsg }) {const name "this is A na…

【机器学习】Adaboost: 强化弱学习器的自适应提升方法

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 Adaboost: 强化弱学习器的自适应提升方法引言Adaboost基础概念弱学习器与强学习…

跨境经营的艺术:中资企业海外市场售后服务创新与挑战

出海&#xff0c;已不再是企业的“备胎”&#xff0c;而是必须面对的“大考”&#xff01;在这个全球化的大潮中&#xff0c;有的企业乘风破浪&#xff0c;勇攀高峰&#xff0c;也有的企业在异国他乡遭遇了“水土不服”。 面对“要么出海&#xff0c;要么出局”的抉择&#xff…