位运算+leetcode ( 2 )

题一:只出现一次的数字(1)

1.链接

136. 只出现一次的数字 - 力扣(LeetCode)

2.思想

  • 借用位运算中异或操作符的特点,a^a=0,0^a=a
  • 先定义一个sum=0
  • 就用一个循环来遍历这个数组,每次都进行 sum ^ = nums[i]
  • 当循环结束,那么此刻sum里就是正确答案

3.代码 

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int result=nums[0];
        for(int i=0;i<nums.size()-1;i++)
        {
            result=result^nums[i+1];
        }
        return result;

    }
};

题二:丢失的数字

1.链接

268. 丢失的数字 - 力扣(LeetCode)

2.思路

  • 借用位运算中异或操作符的特点,a^a=0,0^a=a
  • 先定义一个变量sum,并初始化为0
  • 然后在利用一个for循环来处理,每次循环都进行 sum^=i 的操作
  • 在去遍历整个数组,遍历时,进行sum^=nums[i]的操作
  • 最终sum就是要找的那个值

3.代码

class Solution {
public:
    int missingNumber(vector<int>& nums) {
        int sum=0;
        for(int i=1;i<=nums.size();i++)
        {
            sum^=i;
        }
        for(int i=0;i<nums.size();i++)
        {
            sum^=nums[i];
        }
        return sum;

    }
};

题三:只出现一次的数字 (2)

1.链接

137. 只出现一次的数字 II - 力扣(LeetCode)

2.思路

位图的思想

前提:我们让出现一次的数为:a,出现三次的数统称为b;

  • 由于数据的特殊性,我们可以统计这些数据用二进制表示时,每个位数出现一的个数
  • 判断,该位数是出现1的个数。a 的二进制在该位数时的结果是0或1,而的二进制在该位数时的结果:3的倍数或者0
  • 则统计各个位数出现1的结果则可能是:0+3的倍数,1+3的倍数,0+0,0+1
  • 此时,我们可以对其进行%3的操作,结果等于1,那么则就代表a在这个位是1
  • %3的操作,结果等于1,那么则就将数字在该位修改为1

由于数据范围是:- 2 的31次方——2 的 31 次 方 - 1,那么数据类型为int,就可以进行位图思想

3.代码

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 = sum % 3;
            if (sum == 1)
                ret |= (1 << i);
        }
        return ret;
    }
};

题四:只出现一次的数字 (3)

1.链接

260. 只出现一次的数字 III - 力扣(LeetCode)

2.思路

先定义一个int类型的变量 sum ,并初始化为0

  • 先遍历这个数组,并进行 sum ^ =  nums[ i ]的操作
  • 完成遍历操作后,得到的其实就是:二个只出现一次的数,进行异或的结果(sum)
  • 考虑异或的性质,相同为0,相异为1,sum的二进制表示中从左往右出现的第一个1,就是二个只出现一次的数 的二进制表示形式 的第一个不同处
  • 我们可以进行 sum & (-sum)的操作,这样就得到了从左往右出现的第一个1( rs ),并且其它位全为0
  • 然后对数据进行分组处理,按照nums [ i ] & rs 等于0 和 不等于0 进行处理
  • 当不等于0时,对数据进行 tmp ^ = nums[ i ]的操作,最终  tmp就是二个只出现一次的数的其中之一
  • 然后再将 sum ^ tmp , 就得到了另外一个数

3.代码

class Solution {
public:
    vector<int> singleNumber(vector<int>& nums) {
        long long sum = 0;
        for (int j = 0; j < nums.size(); j++) {
            sum ^= nums[j];
        }
        long long rs = sum & (-sum);
        int tmp = 0;
        for (int j = 0; j < nums.size(); j++) {
            if (nums[j] & rs)
                tmp ^= nums[j];
        }
        int b=sum^ tmp;
        return {tmp, b};
    }
};

 题五:消失的两个数字(消失的数字的综合题)

 1.链接

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

 2.思路

总体思路是:

  • 这个问题可以转化为题四,这里其实就是一组数据,其中只有二个数据只出现一次,其它都出现二次
  • 那么就可以,找到只出现一次的二个数据再二进制表示时,第一个不同的位置
  • 然后根据这个为依据,进行分组处理(处理的思路,就是题1)

 3.代码

class Solution {
public:
    vector<int> missingTwo(vector<int>& nums) {
        int n = nums.size();
        int ret = 0;
        for (int i = 1; i <= n + 2; i++) {
            ret ^= i;
        }
        int sum = 0;
        for (int i = 0; i < n; i++) {
            sum ^= nums[i];
        }

        int rsum = ret ^ sum;
        int rs = rsum & (-rsum);
        int tmp = 0, rtmp = 0;
        for (int i = 0; i < n; i++) {
            if (nums[i] & rs)
                tmp ^= nums[i];
            else {
                rtmp ^= nums[i];
            }
        }
        for (int i = 0; i <= n + 2; i++) {
            if (i & rs)
                tmp ^= i;
            else
                rtmp ^= i;
        }

        return {rtmp, tmp};
    }
};

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

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

相关文章

数据工程工程师学习路线图

数据工程岗位要求 Skill Sets required: - Hands on experience enabling data via Adobe Analytics and/or Google Analytics - Understanding of how customer level data is captured and stitched with behavioural data - Experience working with Testing (QA) and D…

编写代码(LLVM的第一个项目)

下面这个完整代码 它相对较短&#xff0c;因为它建立在LLVM 流程的基础设施上 后者替我们完成大部分工作 我们从程序使用cl命名空间中的llvm工具&#xff08;cl代表命令行&#xff09;来实现我们的命令行接口 需要调用ParseCommandLineOption函数声明cl&#xff1a;&#xff…

Unicode里的表意文字描述符

「表意文字描述符&#xff08;Ideographic Description Characters&#xff09;」区块位于U2FF0-U2FFF范围内&#xff0c;共占据十六个编码空间&#xff0c;但由于实际上只有十二个符号&#xff0c;所以U2FFC-U2FFF的四个位置并没有编排任何符号。 由于汉字的数量庞大&#xff…

绘制角色弧光图

原文&#xff1a;Eva Deverell. 2020. Character Arc Plot & Kurt Vonnegut’s Story Shapes. https://www.eadeverell.com/character-arc/ 一、什么是角色弧 “角色弧”&#xff0c;or“角色发展弧”、“情感弧”&#xff0c;是角色在整个故事中经历的变化的总和。通常主…

APP inventor零基础移动应用开发

1.Android平台简介 Android由谷歌和开放手机联盟共同创建的一款针对手机的开源软件工具包 主要特色 ---开放性 – 丰富的硬件选择 – 开发商不受任何限制 – 无缝集成互联网服务 App Inventor是由Google公司开发的一款在线开放的Android编程工具软件&#xff0c;通过图形化…

寒假作业-day9

创建新项目 选择芯片 开启调试 配置时钟 时钟树的配置 工程管理 打开项目 编写代码

LeetCode、338. 比特位计数【简单,位运算】

文章目录 前言LeetCode、338. 比特位计数【中等&#xff0c;位运算】题目链接与分类思路位运算移位处理前缀思想实现 资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝2W&#xff0c;csdn博客专家、Java领域优质创作者&#xff0c;博客之星、阿里云平台优质作者、专注于Java…

txt 文本文档中空格替换

txt 文本文档中空格替换 1. 原始 txt2. 替换References 1. 原始 txt 2. 替换 编辑 -> 替换 (Ctrl H) 查找内容 (‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌) ​​​ 替换为 ( ) References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

DHCP 动态主机配置协议

目录 1 动态主机配置协议 DHCP 1.1 DHCP 使用客户服务器方式 1.2 DHCP 工作方式 1.3 DHCP 中继代理 (relay agent) 1.4 租用期 (lease period) 1.5 DHCP 协议的工作过程 1 动态主机配置协议 DHCP 动态主机配置协议 DHCP (Dynamic Host Configuration Protocol) 提供了即插…

Java实现用户画像活动推荐系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 兴趣标签模块2.3 活动档案模块2.4 活动报名模块2.5 活动留言模块 三、系统设计3.1 用例设计3.2 业务流程设计3.3 数据流程设计3.4 E-R图设计 四、系统展示五、核心代码5.1 查询兴趣标签5.2 查询活动推荐…

【实战】一、Jest 前端自动化测试框架基础入门(中) —— 前端要学的测试课 从Jest入门到TDD BDD双实战(二)

文章目录 一、Jest 前端自动化测试框架基础入门5.Jest 中的匹配器toBe 匹配器toEqual匹配器toBeNull匹配器toBeUndefined匹配器和toBeDefined匹配器toBeTruthy匹配器toBeFalsy匹配器数字相关的匹配器字符串相关的匹配器数组相关的匹配器异常情况的匹配器 6.Jest 命令行工具的使…

综合项目---博客

一.运行环境 192.168.32.132 Server-Web linux Web 192.168.32.133 Server-NFS-DNS linux NFS/DNS 基础配置 1.配置主机名静态ip 2.开启防火墙并配置 3.部分开启selinux并配置 4.服务器之间通过阿里云进行时间同步 5.服务器之间实现ssh免密…

图神经网络与图表示学习: 从基础概念到前沿技术

目录 前言1 图的形式化定义和类型1.1 图的形式化定义1.2 图的类型 2 图表示学习2.1 DeepWalk: 融合语义相似性与图结构2.2 Node2Vec: 灵活调整随机游走策略2.3 LINE: 一阶与二阶邻接建模2.4 NetMF: 矩阵分解的可扩展图表示学习2.5 Metapath2Vec: 异构图的全面捕捉 3 图神经网络…

红队打靶练习:DEVGURU: 1

目录 信息收集 1、arp 2、nmap 3、dirsearch WEB web信息收集 8585端口 漏洞利用 提权 系统信息收集 横向渗透 get flag 信息收集 1、arp ┌──(root㉿ru)-[~/kali] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:50:56:20:80:1b, IPv4: 192.168.10…

【白话前端】快速区分webGL,webGPU,unity3D和UE4

在3D图形渲染的渲染领域&#xff0c;很多友友们对上述概念傻傻分不清&#xff0c;站在前端开发角度&#xff0c;我用简单语言说下&#xff0c;结论在文章最后。 一、四者都能进行3D图形渲染 它们之间有一些区别&#xff0c;下面我将对它们进行简单的区分&#xff1a; WebGPU&a…

iTop-4412 裸机程序(二十一)- 蜂鸣器与PWM

目录 0.源码1. 蜂鸣器2. iTop-4412 蜂鸣器原理图3. PWM相关寄存器4. 关键源码 0.源码 GitHub&#xff1a;https://github.com/Kilento/4412NoOS 1. 蜂鸣器 蜂鸣器的原理相对简单&#xff0c;学过单片机的同学应该比较了解。我们一般通过引脚输出PWM的输出频率和占空比来控制…

用Python探秘2024年春晚刘谦魔术:两步揭开神秘面纱

在2024年的春晚舞台上&#xff0c;刘谦的魔术表演再次引发了全国观众的热议。他的每一个动作、每一次变换都充满了神秘与未知&#xff0c;让人在惊叹的同时也好奇其背后的秘密。今天&#xff0c;我们将用Python来模拟实现刘谦的一个魔术&#xff0c;并尝试通过两步揭秘其背后的…

标题:探究t-table在Vue.js中的实现与运用 ,可用于数据分析表格展示

标题:探究t-table在Vue.js中的实现与运用 ,可用于数据分析表格展示 一、引言 在当今的Web开发中,表格是一种常见的界面元素,用于展示和操作数据。Vue.js是一款流行的JavaScript框架,具有响应式数据绑定和组件化的特点。在Vue.js中,t-table是一种常用的表格组件,具有高度…

王树森《RNN Transformer》系列公开课

本课程主要介绍NLP相关&#xff0c;包括RNN、LSTM、Attention、Transformer、BERT等模型&#xff0c;以及情感识别、文本生成、机器翻译等应用 ShusenWang的个人空间-ShusenWang个人主页-哔哩哔哩视频 (bilibili.com) &#xff08;一&#xff09;NLP基础 1、数据处理基础 数…

C语言函数入门

在C语言中&#xff0c;函数意味着功能模块。一个典型的C语言程序&#xff0c;就是由一个个的功能模块拼接起来的整体。也因为如此&#xff0c;C语言被称为模块化语言。 对于函数的使用者&#xff0c;可以简单地将函数理解为一个黑箱&#xff0c;使用者只管按照规定给黑箱一些输…