2 异或位运算大厂必刷题

news2025/1/11 4:26:47

文章目录

    • 如何不用额外变量交换两个数
    • 一个数组中有一种数出现了奇数次,其他数都出现了偶数次,怎么找到并打印这种数
    • 怎么把一个int类型的数,提取出最右侧的1来
    • 怎么把一个int类型的数,获取位数为1的数量
    • 一个数组中有两种数出现了奇数次,其他数都出现了偶数次,怎么找到并打印这两种数
    • 一个数组中有一种数出现K次,其他数都出现了M次

如何不用额外变量交换两个数

int a,b;

a=a^b;
b=a^b;
a=a^b;

注意事项:

  • a和b必须是两块独立的内存.

一个数组中有一种数出现了奇数次,其他数都出现了偶数次,怎么找到并打印这种数

题解

  • 解法1: 哈希表做词频统计
  • 解法2: 只用一个变量遍历一遍
    • 用eor异或所有人, 把最后结果留在自己身上, 这么干完一遍之后,最后你返回eor的值就是那个出现了奇数次的数.

怎么把一个int类型的数,提取出最右侧的1来

题意:
在这里插入图片描述

题解:

  • a&(~a + 1)
  • 等同于
  • a & (-a)

在这里插入图片描述

怎么把一个int类型的数,获取位数为1的数量

int a;
int nums=0;
while(a)
{
	a=a&(a-1);
	nums++;
}

一个数组中有两种数出现了奇数次,其他数都出现了偶数次,怎么找到并打印这两种数

题解1:
最常见的解题步骤,面试要求的

void printOddTimesNums(vector<int>& v)
{
    int eor=0;
    for(auto e: v)eor^=e;
    // 假设 a 和 b 是 两种奇数.
    // 从 eor 里随便取一个一位置的数,我们统一取最右侧
    // right = eor & (~eor+1)
    int right = eor & (-eor);
    // 
    // 共有a和b两类的数据 , 将两类数据区分 
    // 我们假设最右侧为1是 属于a类的数据
    // 能够与right按位与不等与0 ,说明属于a类
    int a = 0;
    for(auto e : v)
    {
        if(e & right)
        {
            a^=e;
        }
    }
    int b = eor ^ a;
        cout<< "a="<<a<<endl;
    cout<<"b="<<b<<endl;
    
}

题解2:

void test()
{
    vector<int> v = {1,1,2,2,3,3,3,5,44,55,66,44,55,66,66,66};
    int a =0,b=0;
    int eor =0;
    for(auto e:v)
    {
        eor^=e;
    }
    // eor = a^b
    
    int tmp=eor;
    int i=0;
    int pre=0; // 求出a或者b的数
    while(tmp)
    {
        pre=tmp;
        tmp^=v[i];
        i++;
    }
    cout<< "a="<<pre<<endl;
    cout<<"b="<<(pre^eor)<<endl;
}

一个数组中有一种数出现K次,其他数都出现了M次

题意:一个数组中有一种数出现K次a元素,其他数都出现了M次,M> 1,K<M我到,出现了次的数,要求,额外空复杂度0(1),时间复杂度ON)。

题解:

  • 开一个 32位int的数组 v
  • if v[i] % m == 0 说明 二进制第i位没出现过a元素。
int onlyKTimes(vector<int> &v, int k, int m)
{
    vector<int> t(32, 0);
    // t[0] 0位置的1出现了几个
    // t[i] i位置的1出现了几个
    for (auto num : v)
    {
        for (int i = 0; i <= 31; i++)
        {
            if ((num >> i) & 1 == 1)
            {
                t[i]++;
            }
        }
    }
    int ans = 0;
    for (int i = 0; i <= 31; i++)
    {
        if (t[i] % m != 0)
        {
            ans |= (1 << i);
        }
    }
    return ans;
}

对数器验证算法:

int testonlyKTimes(vector<int> &v, int k, int m)
{
    unordered_map<int, int> map;
    for (auto num : v)
    {
        if (map.find(num) != map.end())
        {
            map[num]++;
        }
        else
        {
            map[num] = 1;
        }
    }
    int ans = 0;
    for (auto num : map)
    {
        if (num.second == k)
        {
            ans = num.first;
            break;
        }
    }
    return ans;
}

vector<int> randomArray(int kinds, int range,int k, int m)
{
    int kNum = rand()% range + 1;
    int times = k; // kNum 出现k次
    int numkinds = rand() % kinds + 1;
    // k*1 + (numkinds - 1) * m;
    vector<int> v(k+ (numkinds-1)*m);
    int index = 0 ;
    for(;index<times;index++)
    {
        v[index] = kNum;
    }
    numkinds--;
    unordered_set<int> set;
    set.insert(kNum);
    while(numkinds!=0)
    {
        int curNum = 0 ;
        do{
            curNum = rand() % range +1;
        }while(set.find(curNum)!=set.end());
        set.insert(curNum);
        numkinds--;
        for(int i=0;i<m;i++)
        {
            v[index++]=curNum;
        }
    }
    // v 填好了
    // 由于数据太整齐了,我们打乱数据
    for(int i=0;i<v.size();i++)
    {
        int j = rand() % v.size() ; // 0 ~ size-1;
        int tmp = v[i];
        v[i]=v[j];
        v[j]=tmp;
    }
    return std::move(v);
}
// 对数器
void test2()
{
    srand((int)time(NULL));
    int kinds = 100;         // 元素种类 1~ 100
    int range = 300;        // 元素范围 1~300
    int testTime = 1000; // 测试次数
    int max = 9;           // k,m 范围 1~9
    cout << "测试开始\n";
    while (testTime--)
    {
        int a = rand()%max + 1;
        int b = rand()%max + 1;
        int k = std::min(a,b);
        int m = std::max(a,b);
        if(k==m){
            m++;
        }


        vector<int> v = randomArray(kinds, range, k, m);
        int ans1 = onlyKTimes(v, k, m);
        int ans2 = testonlyKTimes(v, k, m);
        if (ans1 != ans2)
        {
            cout << "出错了\n";
        }
    }
    cout << "测试结束\n";
}
int main()
{
    test2();
}

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

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

相关文章

开发问题记录20230502

4 Docker普通用户无权限 普通用户执行docker命令提示信息&#xff1a; docker images docker ps -adocker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post “http://%2Fvar%2Frun%2Fdocker.sock/v1.24/c…

Java 的简要介绍及开发环境的搭建(超级详细)

图片来源于互联网 目录 | CONTENT Java 简介 一、什么是 Java 二、认识 Java 版本 三、选择哪个版本比较好 搭建 Java 开发环境 一、下载 Java 软件开发工具包 JDK 二、配置环境变量 自动配置 手动配置 三、下载合适的 IDE IntelliJ IDEA Visual Studio Code Eclip…

Flutter 组件使用:使用 Stack 替代 GlobalKey 的定位 tip-widget 实现

场景 有时候需要在指定位置进行 tip-widget 的弹出与展示&#xff0c;常见的方式是通过给指定位置上的指定 widget 添加 GlobalKey 来实现&#xff1b; 但是&#xff0c;使用这种方式的话&#xff0c;【一】大多数时候都需要进行全局定位转换&#xff08;localToGlobal&#…

c++ 11标准模板(STL) std::vector (三)

定义于头文件 <vector> template< class T, class Allocator std::allocator<T> > class vector;(1)namespace pmr { template <class T> using vector std::vector<T, std::pmr::polymorphic_allocator<T>>; }(2)(C17…

Winform从入门到精通(36)——ColorDialog(史上最全)

文章目录 前言一、属性1、AllowFullOpen2、AnyColor3、Color4、FullOpen5、ShowHelp6、SolidColorOnly7、Tag二、事件1、HelpRequest前言 当我们需要设置某个控件的颜色时,并且需要弹出一个可以选择颜色的对话框时,这时候就需要使用ColorDialog 一、属性 1、AllowFullOpen…

LoadRunner 安装指南:详解安装步骤和常见问题解决方法

目录&#xff1a;导读 引言 LoadRunner安装 LoadRunner的安装 结语 引言 作为一款领先的性能测试工具&#xff0c;LoadRunner 被广泛应用于各种企业级应用程序和系统的性能测试中。然而&#xff0c;对于初学者来说&#xff0c;正确安装 LoadRunner 并不是一件容易的事情。…

Spring 填充属性和初始化流程源码剖析及扩展实现

前言 在上一篇博文 讲解 Spring 实例化的不同方式及相关生命周期源码剖析 介绍了 Spring 实例化的不同方式&#xff0c;本文主要围绕实例化过后对象的填充属性和初始化过程进行详细流程剖析 回顾前言知识&#xff0c;doCreateBean->createBeanInstance&#xff0c;通过 S…

沁恒 CH32V208(二): CH32V208的储存结构, 启动模式和时钟

目录 沁恒 CH32V208(一): CH32V208WBU6 评估板上手报告和Win10环境配置沁恒 CH32V208(二): CH32V208的储存结构, 启动模式和时钟 CH32V 存储容量命名方式 在介绍下面的内容前, 先看一下CH32V系列和存储相关的命名格式, 以CH32V203为例, 前面的CH32V203代表一个系列, 后面的字…

剑指offer(C++)-JZ47:礼物的最大价值(算法-动态规划)

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 题目描述&#xff1a; 在一个m\times nmn的棋盘的每一格都放有一个礼物&#xff0c;每个礼物都有一定的价值&#xff08;价值大于…

使用CometD技术实现web系统中的主动推送

CometD技术通过Http长轮询(或websocket长链接)方式在服务器与客户端之间构建了一条交互的链路。它们都遵守Bayeux协议,交换的消息是Bayeux message,消息格式是JSON。 1、需求说明 当用户登录后,后台根据用户订阅把最新的信息反推给web客户端,展示在页面上。CometD服务器…

菜地管理系统【控制台+MySQL】(Java课设)

系统类型 控制台类型Mysql数据库存储数据 使用范围 适合作为Java课设&#xff01;&#xff01;&#xff01; 部署环境 jdk1.8Mysql8.0Idea或eclipsejdbc 运行效果 本系统源码地址&#xff1a;https://download.csdn.net/download/qq_50954361/87737285 更多系统资源库地…

计算机组成原理9控制单元的结构

9.1操作命令的分析 取值周期间址周期执行周期中断周期 取指周期数据流 PC存放下条指令的地址给MAR访问存储器相应单元&#xff0c;将数据取出来送给MDR寄存器&#xff0c;MDR取出来的内容送给IR指令寄存器&#xff0c;然后对指令进行译码&#xff0c;把指令的操作码部分取出…

医学图像的深度学习的完整代码示例:使用Pytorch对MRI脑扫描的图像进行分割

图像分割是医学图像分析中最重要的任务之一&#xff0c;在许多临床应用中往往是第一步也是最关键的一步。在脑MRI分析中&#xff0c;图像分割通常用于测量和可视化解剖结构&#xff0c;分析大脑变化&#xff0c;描绘病理区域以及手术计划和图像引导干预&#xff0c;分割是大多数…

MySQL解析器和优化器,你了解它们吗?

解析器都做哪些事情 其主要功能是将输入的SQL语句分解为语法单元&#xff0c;然后将这些语法单元转换为内部表示的数据结构&#xff0c;最终生成一个可执行的查询计划。解析器是MySQL中的一个重要组成部分&#xff0c;它直接影响查询的性能和正确性。 词法分析&#xff1a; …

【win11的CARSIM2020安装教程最全,包括下载地址,关闭防火墙】

carsim2020.0软件下载地址参考&#xff1a;https://www.cnblogs.com/bbman/p/15148890.html 百度网盘提取后&#xff0c;先关闭防护墙。 如何永久关闭windows defender杀毒软件。 第一种方式 安装某一杀毒软件&#xff0c;比如某管家、某60&#xff0c;杀毒软件会覆盖Defender…

PC或服务器装双系统

1. 准备工作 1.1U盘启动盘的制作 ①准备一个 4G 以上的 U 盘&#xff0c;备份好U盘资料&#xff0c;后面会对 U 盘进行格式化。 ②去CentOS官网下载你想要安装的 ISO 格式镜像文件&#xff0c;现在通常是CentOS6、7或者8。如果你英文不太好&#xff0c;可以选择使用edge浏览…

【Python入门】NumPy数组副本 vs 视图 / 数组形状 / 数组重塑

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 副本和视图之间的区别 副本和数组视图之间的主要区别在于副本是一个新数组&#xff0c;而这个视图只是原始数组的视图。 副本拥有数据&#xff0c;对副本所做的任何更改都不会影响原始数组&#xff0c;对原始数组所做的任…

《花雕学AI》27:如何在ChatGPT时代提高数字媒体艺术的原创性和价值?

引言 数字媒体艺术是指使用各种数字、信息技术制作的各种形式的有独立审美价值的艺术作品&#xff0c;具有模拟现实的虚拟性、艺术创造的想象性、交互性和使用网络媒体的基本特征。数字媒体艺术是一个跨自然科学、社会科学和人文科学的综合性学科&#xff0c;集中体现了“科学…

vue3+element-plus角色权限管理分配

这里的图片是截图这个老师的项目 为了方便大家使用,我会在每个图片下面将代码原封不动打一遍 在src/uitls/permission.js加入以下内容 本段代码讲解: 参数一:后台传来的路由 参数二:前端所有的路由 先遍历前端所有路由,在里面继续遍历后台路由,通过二者某一个关键字的是否相同…

入门大纲 我为什么使用delta-io 数据湖 替代hive

1 大厂背书 databricks宣布把delta-io共享给apache基金会 并且delta-io从以前打杂的0.x版本升级为1.x 随后就是bug的各种修复和新功能的增加. release note可以看: Releases delta-io/delta GitHub 2 并发控制(解决了多任务并发读写表时的 读写冲突) hive/spark 如果多个任…