数组中只出现一次的两个数-位运算

S32K144(14)ADC 1、简介 开发板S32K144+S32DS+JLINK,裸机版的程序编写 S32K14x包含两个12位ADC模块,ADC0和ADC1 应用程序可能需要ADC的连续采样(4K采样/秒),这可能对CPU有相当大的负载。虽然使用可编程延迟块(PDB)来触发ADC可能会减少一些CPU负载,但当ADC以非常高的速率采样或PDB被绕过时,ADC支持DMA请求功能以获得更高的性能。ADC可以在转换完成时触发DMA(通过DMA请求)。TRGMUX会根据不同的应用需求,使用软件为用户提供更灵活的DMA触发方案,例如,可 阅读详情

前言

        由于要准备找工作了,所以要开始刷题了,但是平时疏于做题,一些知识已经悄然忘记,特开此专栏记录我复习的过程

今天做牛客上一道位运算的题,刚开始是暴力求解,然后就想到了位运算。

数组中只出现一次的两个数字_牛客题霸_牛客网

知识讲解

首先,位运算是指将数字转换为二进制的情况下进行的操作

5= 0 1 0 1
6= 0 1 1 0 

位运算分为逻辑位运算符和位移位运算符

逻辑位运算符

位与(&)

当两者都为1时,结果为1

  16 & 5
     |
     V
 0 1 1 1 0
 0 0 1 0 1
 ---------
 0 0 1 0 0

位或(|)

当且仅当两位都为0时,结果为0

  13 | 5
     |
     v
  0 1 1 1
  0 1 0 1
  -------
  0 1 1 1

异或(^)

当且仅当两位不同时,结果为1

  13 ^ 5
     |
     v
  0 1 1 1
  0 1 0 1
  -------
  0 0 1 0

所以异或就有一个性质,就是任何数异或自己都等于0

所以就有  a^b^a=b

用异或还可以进行数据交换

a=a^b

b=a^b

a=a^b

这里就完成了数据的交换

按位取反( ~ )

将所有的数字0变成1,1变成0

   13
0 1 1 1
   |
   V
  ~13
1 0 0 0

位移运算符

左移(<<)

x<<y就表示将x转换为二进制,将所有的位都向左移动y位,然后末位补0,每移动一位就相当于这个数乘了2倍

   5<<2
0 0 0 1 0 1
    |
    v
0 1 0 1 0 0
    20

右移(>>)

x>>y则表示将x转换为二进制,将所有的位都向右移动y位,每移动一位就相当于给x除了2,接着向下取整

        然后,还分为了两种情况,如果x为正则高位补0,x为负则高位补1(这里涉及到了二进制的正负,如果是有符号整数,最高位是符号位,为0则是正数,为1则是负数)

   5>>2
0 0 0 1 0 1
    |
    v
0 0 0 0 0 1
    1

题目思路

        这里题目是找出一个数组中只出现一次的两个数,刚好就能用到异或的性质,由于一个数异或自己等于0,而0异或任何数都等于那个数

        所以首先就定义一个变量a,赋值为0,然后遍历数组,将这个变量与数组中的每个值都异或一遍,由于大部分数都会出现两次,异或后都是0,最后a的值就是那两个只出现一次的值异或的结果

        然后,因为两个数不相等,所以总会有某一位,一个数是1,而另一个数是0

5 =  0 1 0 1
4 =  0 1 0 0

这里的5和4就是,最低位首先就不相同

        所以,第二步就是定义一个变量b,赋值为1,然后与a进行异或,再通过左移运算符一步步找到两个出现次数为1的数的第一个不相同的位

        再然后遍历原数组,通过与b进行与运算,将原数组分成了两部分,然后定义两个变量,分别与这两部分的值进行异或,就能求出出现次数为1的那两个数

        题目还要求按升序返回,简单用if语句判断一下,然后用swap交换一下就行

#include <fstream>
#include <vector>
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型vector
     */
    vector<int> FindNumsAppearOnce(vector<int>& nums) {
        int a=0;
        //首先用a与数组中的每个数都异或一遍
        for(int num:nums)
        {
            a^=num;
        }
        int b=1;
        //接着找出两个出现一次的数第一个不同的位
        while((b&a)==0)
        {
            b<<=1;
        }
        //接着定义两个变量分别求出那两个数
        int num1=0,num2=0;
        for(int num:nums)
        {
            if(num&b)
            {
                num1^=num;
            }
            else 
            {
                num2^=num;
            }
        }
        if(num1>num2) swap(num1, num2);
        vector<int> v={num1,num2};
        return v;

    }
};

菜鸟哥玩蓝牙Ble4.0系列 ESP32初玩篇③ Beacon —— 广播应用,室内定位,内容推送 文章目录1、前言1.1 什么叫做Beacon?1.2 Beacon使用场景1.3 Beacon协议落地实现2、ESP32 Beacon案例3、Beacon核心库 —— BLEBeacon、BLEEddystoneTLM、BLEEddystoneURL3.1 BLEBeacon3.2 BLEEddystoneTLM3.3 BLEEddystoneURL 授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力。希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石。。。 阅读详情

相关推荐

Edge主页被2345劫持?手动清理注册表与组策略的完整方案

浏览器主页劫持是Windows系统中常见的恶意篡改行为,其原理是通过修改注册表、快捷方式、组策略等多处系统配置,强制锁定浏览器启动页。这类劫持不仅影响上网体验,还可能带来隐私泄露和恶意软件感染风险。在安全防护与系统优化场景中,掌握手动清理主页劫持的技能至关重要。本文针对Edge主页被2345导航劫持的问题,深入解析劫持入口,提供从快捷方式、注册表到组策略的逐层清理步骤,并给出防复发策略,帮助用户彻底摆脱顽固劫持。

weixin_30582943的博客 384

找数组中只出现一次的两个数 位运算

找数组中只出现一次的两个数 位运算

lifqjdlut的博客 642

手把手教你用STM32F103的普通IO口读取SSI编码器(附完整代码与示波器调试心得)

本文详细介绍了如何利用STM32F103的普通IO口读取SSI绝对式编码器数据,提供完整的硬件连接方案、精确时序控制的软件实现及示波器调试技巧。通过低成本方案实现高精度位置反馈,适用于工业自动化和机器人控制领域。

weixin_29172963的博客 452

【位运算】只出现一次的数字

异或运算典型应用,只出现一次的数字

liuwanqing233333的博客 327

【CloudCompare】Windows源码编译CloudCompare

本文详细介绍了在Windows环境下编译安装CloudCompare V2.12.0的过程。首先配置了PCL 1.14.1、CMake 3.30.6和QT 5.14.2开发环境,使用Visual Studio 2022工具集。然后下载源码并通过CMake进行配置,特别注意勾选PLUGIN_STANDARD_QPCL以支持PCD文件加载。最后在VS2022中编译安装,并指出Debug模式下可能遇到的VTK库后缀问题,需添加CMAKE_DEBUG_POSTFIX变量解决。整个流程涵盖了从环境搭建到最终编译成功的

yijiujiusan的博客 486

基于Costas环的载波同步实现及Matlab仿真

其中,第一个相位环接收带噪声的待同步载波,并产生一个相位误差信号,这个误差信号再通过第二个相位环进行反馈控制,使得两个相位环的相位差保持为90度,最终输出同步载波信号。接下来,我们可以编写Costas环的仿真程序,并将上面生成的信号输入到Costas环中进行同步,最终输出同步后的载波信号。综上所述,本文介绍了如何使用Matlab实现基于Costas环的载波同步,并给出相应的源代码。上述代码中,我们初始化了Costas环的各个参数,然后通过循环迭代实现了相位估计和相位误差控制,最终输出了同步后的载波信号。

2301_78484069的博客 1048

位运算 - 只出现一次的数字 III - Leetcode 260

位运算 - 只出现一次的数字 III - Leetcode 260 给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。 进阶:你的算法应该具有线性时间复杂度。你能否仅使用常数空间复杂度来实现? 示例 1: 输入:nums = [1,2,1,3,2,5] 输出:[3,5] 解释:[5, 3] 也是有效的答案。 示例 2: 输入:nums = [-1,0] 输出:[-1,0] 示例 3: 输入:nums = [0,1

njuptACMcxk的博客 276

uniapp - HBuilder提示adb: failed to install X Failure [INSTALL_ARSE_FAILED_NOT_APK:X(安装HBuilder调试基座失败)

安装HBuilderX调试基座失败,uniapp APP运行到手机adb: failed to install,Uniapp提示adb,uniapp ios 真机调试报错 uniapp安卓调试,Uniapp安装不了基座,手动安装基座,正在安装手机端HBuilder调试基座,点击运行到手机报错信息:基座无法正常安装,Uniapp-安装HBuilder调试基座失败解决方案,解决 HBuilderX 安卓基座安装失败的问题,显示adb报错,UniApp苹果真机运行调试(自定义基座,版本更新后/没有基座打开失败)如

🏆 前端领域优质创作者 8061

Leetcode中等:260. 只出现一次的数字 III

给你一个整数数组nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。找出只出现一次的那两个元素。你可以按任意顺序返回答案。你必须设计并实现线性时间复杂度的算法且仅使用常量额外空间来解决此问题。/***/示例 1:输入:nums = [1,2,1,3,2,5]输出:[3,5]解释:[5, 3] 也是有效的答案。示例 2:输入:nums = [-1,0]输出:[-1,0]示例 3:输入:nums = [0,1]输出:[1,0]

kamijouzero的博客 1618

python爬虫案例——腾讯网新闻标题(异步加载网站数据抓取,post请求)(6)

本篇案例主要讲解异步加载网站如何分析网页接口,以及如何观察post请求URL的参数,网站数据并不难抓取,主要是将要抓取的数据接口分析清楚,才能根据需求编写想要的代码。

@优快云盲敲代码的阿豪的博客 946

BevFusion (1): 传感器介绍

激光雷达,也称光学雷达(LIght Detection And Ranging)是激光探测与测距系统的简称,它通过测定传感器发射器与目标物体之间的传播距离,分析目标物体表面的反射能量大小、反射波谱的幅度、频率和相位等信息,从而呈现出目标物精确的三维结构信息。激光雷达是自动驾驶车辆的关键传感器,如下图所示,车辆上方旋转的圆柱体对应就是激光雷达传感器。

@bangbang的博客 1475

【LeetCode260】只出现一次的数字 III(分组是关键,位运算)

一、题目 二、思路 如果我们把数组分成两个子数组,每个数组都满足「恰好有一个元素只出现一次,其余所有元素均出现两次」,就可以按照之前的方法直接解决了。 (1)直接遍历一遍数组并逐一【异或】一定可以得到那两个不同元素的异或。如数组[2,2,1,1,3,4]。这个数组的异或值最终是3 与 4 的异或值为 div = 0011 ^ 0100 = 0111。 (2)取最低位置的 ‘1’来进行对 a 与 b 的分组 div &= -div; -div = 1000 + 0001 = 1001 (将div所有

发现问题,并解决问题,批判性思维 877

群辉NAS映射为本地盘符

鼠标右击网络→映射网络驱动器→以上适合通过局域网操作,采用ZeroTier组网后,也可以按照以上步骤实现,这时使用 “虚拟局域网”的IP地址。

dgnankai的专栏 5775

剑指Offer:数组中只出现一次的两个数(二)

题目描述 一个整型数组里除了两个数字只出现一次,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 示例1 输入 [1,4,1,6] 返回值 [4,6] 说明:返回的结果中较小的数排在前面 解题方法 ...

weixin_43364551的博客 114

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

数组中只出现一次的数字

思路 首先:位运算中异或的性质:两个相同数字异或=0,一个数和0异或还是它本身。 当只有一个数出现一次时,我们把数组中所有的数,依次异或运算,最后剩下的就是落单的数,因为成对儿出现的都抵消了。 依照这个思路,我们来看两个数(我们假设是AB)出现一次的数组。我们首先还是先异或,剩下的数字肯定是A、B异或的结果,这个结果的二进制中的1,表现的是A和B的不同的位。我们就取第一个1所在的位数,假设是第3位...

weixin_43857365的博客 131

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

只出现一次的数字 III

只出现一次的数字 III

重铸自身根基的博客 851

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

数组中数字出现的次数(位运算的运用)

背景知识: 若x是任意整数, 则有: x^x=0; x^0=x; 三道题: 一个数组,其中只有一个数只出现一次,其他数字均出现两次,求只出现一次的数 答:将所有数异或一遍,最终结果即所求 一个数组,其中有两个数只出现一次,其他数字均出现两次,求只出现一次的数 答:记只出现一次的数分别为a, b; 所有数字异或和的值为a^b!=0; 记a^b的二进制表示在inx位上为1; 数组中在inx...

Sirius_han的博客 601

2022.03.07 - NC035.BM52 数组中只出现一次的两个数字

文章目录1. 题目2. 思路(1) 位运算3. 代码 1. 题目 2. 思路 (1) 位运算 将所有数字进行异或运算,结果即为两个只出现一次的数字进行异或运算的结果。 找出该结果中任意一位值为1的二进制位,根据该二进制位,可以将所有数字分为两组,两个只出现一次的数字必定各在一组,其他数字必定两两出现在某一组。 分别对两组中所有数字进行异或运算,即可得到两个只出现一次的数字。 3. 代码 public class Test { public static void main(String[] a

阿财继续努力 211

只出现一次数字用c语言,Leetcode 260. 只出现一次的数字 (位运算)

只有一个元素只出现,其余都出现两次,那么一次位运算就能解决。如果有两个数只出现一次,其余两个数都只出现一次,一次位运算得到的是a^b,那么如何分开这两个数?这个思路比较有跳跃性,a和b不同,所以a和b至少有一位不同,不妨取一个最低位k,一个必为0,另外一个必为1,然后将剩下的数按照位为1和位0分为两组,就等价于两个前面的问题。这个思路跳跃性比较强。不容易想到。class Solution {pu...

weixin_42498206的博客 107

【位运算】只出现一次的数字II / 只出现一次的数字III / 判定字符是否唯一 / 两整数之和

只出现一次的数字II / 只出现一次的数字III / 判定字符是否唯一 / 两整数之和

小羊的博客 444

如何快速找出数组中只出现一次的两个数

今天和小伙伴们聊天,聊到一个问题:如何快速找出一个数组中只出现一次的两个数,其他元素出现两次? 直观上,这个可以可以使用一个Map,Map对应的键值key就是数组中的元素,value就是这个元素出现的次数。这样我们通过一次遍历数组中的元素,如果元素出现在map中,则将其对应的value加1,否则将元素添加到map中,这样遍历完一遍数组,我们就可以得到数组中每个元素对应出现的次数,然后再通过遍历一

yangfeisc的专栏 4754

数组中除了两个数只出现过一次,其他的均出现过两次,请找出这两个只出现过一次的数

如题:数组中除了两个数只出现过一次,其他的均出现过两次,请找出这两个只出现过一次的数 例如:{10,9,8,7,6,6,7,8,9,10,5,5,4,3}; 4和3只出现过一次,请找出出现过一次的数。 首先想到的代码应该是上一个提到的遍历两次取出没有找到的相同的数字,代码如下: public static List findOnlyNum(int[] array){ List li

木安 1万+

数组中只出现一次的两个数字

今天碰到的题相对较难,即使看了题解依然花了较长时间才解出,在此记录,同时复习一下python的位运算。 该题的解题流程如下: 遍历一遍数组,然后对数组中每个值都进行异或操作,相同的两个元素异或后全部变成了0,因此实际上数组的每个值异或后就是两个不同的元素进行异或的结果。两个不同的值异或的结果有一个特殊的地方需要掌握,将这两个不同的值A,B都转化为二进制,比如1101,1111,他们异或后就变成了0010,也就是只有不同的位是1,其他都是0,当然异或后可能有多个位是1。 遍历求解出step 1结果中最低位.

WenbinYao&YouweiHu 1076

数组中两个数出现一次其余出现两次

/* 有两个数A B分别出现一次 其余出现两次 * 只要能找到一个划分一个包含A 一个包含B 对两个分别使用找出出现一次的算法 * * */ class Solution { public: vector<int> singleNumber(vector<int>& nums) { int axorb=0; for(i...

futangxiang4793的博客 440

位运算知识点总结

一,位运算的操作符         在C/C++中与位运算有关的操作符并不多,一共只有6个,分别是按位与(&amp;)、按位或(|)、按位非(~)、按位异或(^)、左移(&lt;&lt;)与右移操作(&gt;&gt;)。 1、与运算(A &amp; B)         对应的位上均为1时,运算结果为1,否则为0。 #include &lt;bits/stdc++.h&gt; usin...

qq_22158743的博客 1813

在一个整型数组中有两个数 a 、b值出现一次,其他数都出现两次。求出 a 和 b

在一个整型数组中有两个数 a 、b值出现一次,其他数都出现两次。求出 a 和 b

不要总是等明天再开始 512
上一篇: 栈和队列(数据结构)
下一篇: 数组中出现超过一半的数字——摩尔投票算法
宴之敖者、
博客等级 码龄4年 131粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值