位运算算法【2】

news2024/11/19 1:28:07

在这里插入图片描述

文章目录

    • 🍷371. 两整数之和
      • 🥙题目
      • 🍅算法原理
      • 🍆代码实现
    • 🍸137. 只出现一次的数字 II
      • 🧆题目
      • 🫒算法原理
      • 🥔代码实现
    • 🍹面试题 17.19. 消失的两个数字
      • 🥚题目
      • 🥥算法原理
      • 🥕代码实现

🍷371. 两整数之和

🥙题目

题目链接:371. 两整数之和 - 力扣(LeetCode)

给你两个整数 ab不使用 运算符 +- ,计算并返回两整数之和。

示例 1:

输入:a = 1, b = 2
输出:3

示例 2:

输入:a = 2, b = 3
输出:5

提示:

  • -1000 <= a, b <= 1000

🍅算法原理

这种不能使用+或者-操作符,大概率就是用位运算来操作。

异或运算又叫无进位相加,而按位与全1为1,又可以找出需要进位的位置,然后让这个位置往左移一位即可表示进位。

然后一直循环这个操作,直到进位的结果为0为止

image-20231129123018851

🍆代码实现

class Solution {
public:
    int getSum(int a, int b)
    {
        while(b!=0)
        {
            int x = a^b;	//无进位相加
            //unsigned int 防止溢出
            unsigned int carry = (unsigned int)(a&b) << 1;    //进位
            a = x;
            b = carry;
        }
        return a;
    }
};

运行结果:

image-20231129123427371

🍸137. 只出现一次的数字 II

🧆题目

题目链接:137. 只出现一次的数字 II - 力扣(LeetCode)

给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现三次。 请你找出并返回那个只出现了一次的元素。

你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。

示例 1:

输入:nums = [2,2,3,2]
输出:3

示例 2:

输入:nums = [0,1,0,1,0,1,99]
输出:99

提示:

  • 1 <= nums.length <= 3 * 104
  • -231 <= nums[i] <= 231 - 1
  • nums 中,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次

🫒算法原理

假设出现一次的数是a,其他的数都是出现三次,那么这所有的数的其中一个比特位,只会有四种情况:

  1. 3n个0 + 0,比特位总和为0
  2. 3n个0 + 1,比特位总和为1
  3. 3n个1 + 0,比特位总和为3n
  4. 3n个1 + 1,比特位总和为3n+1

我们将这些数通通取模%3,此时的情况是和只出现一次的那个数的比特位

此题还能拓展一下,即一个数出现一次,其他数均出现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 e:nums)    //统计nums中所有数第i位的和
                if((e>>i)&1 == 1)   sum++;
            
            sum%=3;
            if(sum == 1)    ret |= 1<<i;
        }
        return ret;
    }
};

运行结果:

image-20231129135743950

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

🥚题目

题目链接:面试题 17.19. 消失的两个数字 - 力扣(LeetCode)

给定一个数组,包含从 1 到 N 所有的整数,但其中缺了两个数字。你能在 O(N) 时间内只用 O(1) 的空间找到它们吗?

以任意顺序返回这两个数字均可。

示例 1:

输入: [1]
输出: [2,3]

示例 2:

输入: [2,3]
输出: [1,4]

提示:

  • nums.length <= 30000

🥥算法原理

这里可以将思路转换,假设缺少的两个数为ab,我们将nums看作一个整体,[1,N]看作整体,然后将这两个合并,就转换成了这一堆数中,只有ab出现了一次,其他的数均出现了两次

image-20231129141638012

将这两组数异或之后得到一个数tmp,这个是就是a^b的结果,然后只需要将ab分开即可。

根据异或的规则,相同为0,相异为1,我们要找到tmp中一个比特位为1的位置。然后将所有的数划分为两大类,即

  • x0
  • x1

image-20231129142718390

所以整体就是分为三步:

  1. 将所有的数异或在一起,得出一个tmp
  2. 找到tmp中,比特位为1的那一位
  3. 根据x位的不同,划分成两类异或

🥕代码实现

class Solution {
public:
    vector<int> missingTwo(vector<int>& nums)
    {
        //异或所有数
        int tmp = 0;
        for(auto e:nums)    tmp^=e;
        for(int i=1;i<=nums.size()+2;i++) tmp^=i;

        //找出比特位为1的位置
        int diff = 0;
        while(1)
        {
            if(((tmp>>diff)&1) == 1)  break;
            else    diff++;
        }

        //分类异或
        int a = 0;
        int b = 0;
        for(auto e:nums)
        {
            if(((e>>diff)&1) == 1)    a^=e;
            else    b^=e;
        }
        for(int i=1;i<=nums.size()+2;i++)
        {
            if(((i>>diff)&1) == 1)    a^=i;
            else    b^=i;
        }
        return {a,b};   
    }
};

运行结果:

image-20231129144133719

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

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

相关文章

Android : GPS定位 获取当前位置—简单应用

示例图&#xff1a; MainActivity.java package com.example.mygpsapp;import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat;import android.Manif…

burp2023专业版,配置上游代理太难找

burpsuite2023专业版的工具栏与之前的版本不同的是&#xff0c;工具栏中没有了user options这一选项 但在通常的使用过程中&#xff0c;常用到配置上游代理。之前的版本呢&#xff0c;上游代理的配置都在user options选项中设置&#xff0c;user options选项还在工具栏中&#…

小航助学题库蓝桥杯题库c++选拔赛(23年8月)(含题库教师学生账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09; 需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09;

【JS Promise, Promise.all 与 async/await用法详解】

目录 PromisePromise基本使用Promise可进行连续回调Promise回调可接受入参1.工作原理 async/await总结参考文档&#xff1a; 异步 let a 0setTimeout(() > {a 1}, 1000)console.log(a) // 0此时这个延迟就成为异步执行的了&#xff0c;a值还没有变1就被使用输出&#xff0…

【产品经理】AI在SaaS产品中的应用及挑战

随着ChatGPT大模型在全球的爆火&#xff0c;AI迅速在各个行业内&#xff0c;助力于各行业的效率提升。而SaaS领域&#xff0c;AI同样也大有可为。 AI&#xff08;人工智能&#xff0c;Artificial Intelligence的缩写&#xff09;近一年来一直处于舆论风口&#xff0c;随着ChatG…

NX二次开发UF_CURVE_create_bridge_feature 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_create_bridge_feature Defined in: uf_curve.h int UF_CURVE_create_bridge_feature(UF_CURVE_bridge_data_p_t bridge_data, tag_p_t bridge_feature ) overview 概述 …

在零信任架构下的API安全与滥用防护(上)

引言 在当今数字化的浪潮中&#xff0c;应用程序编程接口&#xff08;API&#xff09;的战略重要性愈发凸显。API不仅仅是现代软件和互联网服务之间沟通的桥梁&#xff0c;更是企业价值创造的核心。随着API的快速发展和广泛应用&#xff0c;安全问题随之而来&#xff0c;其中A…

保障海外业务发展,Coremail提供高效安全的海外通邮服务

11月22日&#xff0c;Coremail举办《全球通邮&#xff1a;如何保障安全、快捷的海外中继服务》直播分享会&#xff0c;直播会上Coremail安全团队和直播嘉宾复旦大学校园信息化办公室徐艺扬老师就海外中继服务进行了深度分享。 ​ 海外通邮困难重重 境外垃圾邮件数量居高不下…

【Spring Boot 源码学习】BootstrapRegistryInitializer 详解

Spring Boot 源码学习系列 BootstrapRegistryInitializer 详解 引言往期内容主要内容1. 初识 BootstrapRegistryInitializer2. 加载 BootstrapRegistryInitializer3. BootstrapRegistryInitializer 的初始化 总结 引言 书接前文《初识 SpringApplication》&#xff0c;我们从 …

【动态规划】LeetCode2552:优化了6版的1324模式

本文涉及的基础知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 动态规划 本题其它解法 C前缀和算法的应用&#xff1a;统计上升四元组 类似题解法 包括题目及代码C二分查找算法&#xff1a;132 模式解法一枚举3C二分查找算法&am…

通用plantuml模板头

通用plantuml文件 startuml participant Admin order 0 #87CEFA // 参与者、顺序、颜色 participant Student order 1 #87CEFA participant Teacher order 2 #87CEFA participant TestPlayer order 3 #87CEFA participant Class order 4 #87CEFA participant Subject order …

logcat日志的使用——Qt For Android

前言 最近一直用qt开发安卓app&#xff0c;一直无法用真机调试&#xff0c;可能是缺什么东西。但是如果通过Qt Creator在真机上运行&#xff0c;可以在电脑控制台看打印&#xff08;安卓本身的日志、qDebug之类的打印&#xff09;&#xff0c;所以我是通过打印猜测问题所在&am…

autojs-ui悬浮按钮模板

注释很详细&#xff0c;直接上代码 涵盖很多常用知识点&#xff0c;也可当知识点看 运行效果长这样&#xff1a; 开始按钮相当于开关&#xff0c;按钮内容会随点击变换控制台按钮可让运行框显示或隐藏退出按钮退出程序并在3s后关闭运行框只需在对应函数内添加需要实现的内容即可…

基于Netty实现TCP通信

创建一个Maven项目添加下面依赖 <dependencies><!-- 日志依赖 --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.32</version></dependency><dependency><g…

基于PaddleOCR银行卡识别实现(三)

前言 基于PaddleOCR银行卡识别实现&#xff08;一&#xff09; 基于PaddleOCR银行卡识别实现&#xff08;二&#xff09; 前两篇文章讲了检测模型和识别模型的实现&#xff0c;这一篇文章姗姗来迟&#xff0c;将讲解下两个模型的串联应用和PaddleOCR的源码精简&#xff0c;下面…

AI - FlowField(流场寻路)

FlowField流场寻路&#xff0c;利用网格存储每个点对目标点的推力&#xff0c;网格上的单位根据对于推力进行移动。用于大量单位进行寻路对于同一目的地的寻路&#xff0c;常用于rts游戏等。 对应一张网格地图(图中黑块是不可行走区域) 生成热度图 计算所有网格对于目标点(…

蓝桥杯第199题 扫地机器人 暴力优化 二分法 简单题 C++

题目 扫地机器人 - 蓝桥云课 (lanqiao.cn)https://www.lanqiao.cn/problems/199/learning/?page1&first_category_id1&name%E6%89%AB%E5%9C%B0%E6%9C%BA%E5%99%A8%E4%BA%BA 思路和解题方法 首先&#xff0c;通过cin语句输入了终点位置n和障碍物数量k。使用一个数组a来…

零基础也可以学编程,分享中文编程工具开发软件

零基础也可以学编程&#xff0c;分享中文编程工具开发软件 给大家分享一款中文编程工具&#xff0c;零基础轻松学编程&#xff0c;不需英语基础&#xff0c;编程工具可下载。 这款工具不但可以连接部分硬件&#xff0c;而且可以开发大型的软件&#xff0c;象如图这个实例就是用…

MySQL 插入数据报错 Incorrect string value

当在sys_dict_data表中执行插入语句&#xff1b; insert into sys_dict_data values(1, 1, 男, 0, sys_user_sex, , , Y, 0, admin, sysdate(), , null, 性别男);报错信息如下&#xff1a; insert into sys_dict_data values(1, 1, 男, …

记录一次现网问题排查(分享查域名是否封禁小程序)

背景&#xff1a; 收到工单反馈说现网业务一个功能有异常&#xff0c;具体现象是tc.hb.cn域名无法访问&#xff0c;客户地区是河南省&#xff0c;这里记录下排查过程和思路。 首先梳理链路 客户端域名 tc.hb.cn cname—> domainparking-dnspod.cn(新加坡clb)—> snat—&…