异或相关算法

news/2025/2/9 9:57:38/

在这里插入图片描述

文章目录

  • 1. 异或的性质
  • 2. 题目一
  • 3. 题目二
  • 4. 题目三
  • 5. 题目四

1. 异或的性质

我们知道,异或的定义是:相同为0,相异为1。所以也被称为无进位相加,根据这定义,我们可以得出三个性质:
1. N ^ N=0。2. N ^ 0=N。3. 异或满足结合律与交换率,所以一组数据,一起异或,结果一定是同一个值

2. 题目一

如何不创建临时变量,交换两个值
答案是:a=a ^ b,b=a ^ b,a=a ^ b

证明:a=a ^ b,a变了,b没变。b=a ^ b,就等于b=a ^ b ^ b,b=a ^ 0,b=a。最后一步,a=a ^ b ^ a,就是a=b ^ 0,a=b。
两个数就进行交换了,但是这个方法只能用在a与b指向不同的内存空间,如果指向同一个内存空间,这样写会把此内存置成0。

3. 题目二

怎么把一个int类型的数,提取出最右侧的1来
什么意思呢?
在这里插入图片描述
就是一个数a,如何得到ans这样的值,就是把最右侧的1提取出来。

答案是:a&(-a)或者a&((~a)+1)这个大家可以自己证明一下。

4. 题目三

一个数组中有两种数出现了奇数次,其它数都出现了偶数次,怎么找到这两个数
解题思路:假设出现两个奇数次的是a和b。
第一步:将数组里的数全部异或,那么结果就是a ^ b,因为其它都是偶数次,异或为0。
第二步:找出a ^ b最右侧的1位置,因为a和b是不同的,所以a ^ b一定不为0,所以a ^ b二进位中一定存在1的。
第三步:a ^ b二进位中的1位置,说明a和b在此位置上是不相等的。我们就把数组中所有此位置为1的分成一组,此位置为0的分成一组。
第四步:将此位置为1的异或在一起就能得出其中一个奇数次,在异或a ^ b,就能得出另外一个奇数次

代码实现:
在这里插入图片描述

5. 题目四

一个数组中有一种数出现K次,其它数都出现了M次,M>1,K<M。找到出现K次的数。要求:时间复杂度O(N),空间复杂度O(1)

解题思路:
第一步:因为一个int类型是32位,所以我们可以先定义一个32的数组。因为是常量数组所以空间复杂度是O(1)。

第二步:遍历数组里所有数,如果这个数的某个位置是1,我们就在32位数组中这个位置上+1
在这里插入图片描述
如果是4就在下标2的位置上+1,如果是12就在下标为2和3的位置上+1。

第三步:遍历这个32位数组,如果某位置上能被M整除,说明出现K次的那个数在此位置上为0,如果此位置不能被M整除,说明此位置上出现K次的那个数此位置为1。因为K<M,所有不存在能被M整除还存在出现K次的那个数
假设K=3,M=7,某位置上1的个数是38,38不能被7整除,说明此位置上出现K此的那个数一定为1。

第四步:定义一个变量为0,如果此位置上不能整除,我们就左移1,然后或上去

代码实现:
在这里插入图片描述


http://www.ppmy.cn/news/35262.html

相关文章

clang-format配置

# https://clang.llvm.org/docs/ClangFormatStyleOptions.html # https://www.bbsmax.com/A/VGzlMjexJb/# 语言: None, Cpp, Java, JavaScript, ObjC, Proto, TableGen, TextProto Language: CppBasedOnStyle: LLVM# 访问说明符(public、private等)的偏移 AccessModifierOffset…

[数据结构] 用两个栈实现队列详解

文章目录 一、栈实现队列的特点分析 1、1 具体分析 1、2 整体概括 二、用栈模拟队列代码的实现 2、1 手撕 栈 代码 2、1、1 stack.h 2、1、2 stack.c 2、2 用栈实现队列代码 &#x1f64b;‍♂️ 作者&#xff1a;Ggggggtm &#x1f64b;‍♂️ &#x1f440; 专栏&#xff1a;…

ES6新特性--Set集合

Set集合(1).Set集合概述 ES6 提供了新的数据结构 Set(集合)。它类似于数组,但成员的值都是唯 一的,集合实现了 iterator 接口,所以可以使用【扩展运算符】 和【for…of…】进 行遍历 。 (2).Set集合的声明 //集合的声明 let s = new Set(); //声明的时候同时初始化,可以传…

STM-32:按键控制LED灯 程序详解

目录一、基本原理二、接线图三、程序思路3.1库函数3.2程序代码注&#xff1a;一、基本原理 左边是STM322里电路每一个端口均可以配置的电路部分&#xff0c;右边部分是外接设备 电路图。 配置为 上拉输入模式的意思就是&#xff0c;VDD开关闭合&#xff0c;VSS开关断开。 浮空…

English Learning - L2 第 9 次小组纠音 辅音 [s] [z] [ʃ] [ʒ] [h] [ʧ] [ʤ] 2023.3.25 周六

English Learning - L2 第 9 次小组纠音 辅音 [s] [z] [ʃ] [ʒ] [h] [ʧ] [ʤ] 2023.3.25 周六共性问题babies /ˈbeɪbɪz/Zoo /zuː/jazz /ʤz/reads /riːdz/slowly /ˈsləʊli/shop /ʃɒp/delicious /dɪˈlɪʃəs/usually /ˈjuːʒʊəlɪ/whole /həʊl/help /help/…

adb常用指令

echo mem > /sys/power/state // kernel休眠echo on > /sys/power/state //kernel唤醒-------------------------------------------------adb shell pm list packages -f // 查看所有应用位置adb shell pm path 包名 //列出指定包名的apk位置adb shell pm list packages…

010-Ansible数组

定义&#xff1a; 最终都需要将定义的数组转换为列表(list)类型进行操作。 使用yaml语法定义数组 - name: Define an array using YAML syntaxset_fact:my_array: [value1, value2, value3]使用空格分隔的字符串定义数组 - name: Define an array using space-separated st…

Java中Static关键字的五种用法详解

Static的五种用法大致如下&#xff1a; 修饰成员变量&#xff0c;使其成为类变量&#xff0c;也叫静态变量修饰成员方法&#xff0c;使其成为类方法修饰内部类&#xff0c;使其成为静态内部类静态代码块静态导包 直接一点&#xff0c;static关键字就是把属性和方法变为类相关&…