使用异或查找数组中出现奇数次的唯一或唯二数字

题目:
1.查找数组中的所有出现奇数次的数字,要求数组中不能有负数

2.现在有个数组,假设这个数组中出现奇数次的数字有且只有1个,请把它找出来

3.现在有个数组,假设这个数组中出现奇数次的数字有且只有2个,请把它找出来

先看题1的:
以下代码用c实现,由于c语言中没有字典,也不想上升到c++,所以实现起来较为复杂,可以不看,直接看下面的异或算法

#include<stdio.h>
#include <stdlib.h>struct MyStruct
{int* arr;int arr_size;
};int cmpfunc(const void* a, const void* b)
{return (*(int*)a - *(int*)b);
}
struct MyStruct find_odd_occurrence(int a[], int n) {//查找数组中的所有出现奇数次的数字,要求数组中不能有负数//先对数组a进行排序qsort(a, n, sizeof(int), cmpfunc);int last_num = - 1;int* res = (int*)malloc(n * sizeof(int));int res_index = 0;for (int i = 0; i < n; i++) {if (last_num == a[i]) {continue;}else {last_num = a[i];}int count = 1;for (int j = i + 1; j < n; j++) {if (a[j] == a[i]) {count += 1;}}if (count % 2 == 1) {res[res_index] = a[i];res_index += 1;}}//重新申请一个数组把多余的数字去掉int* res_arr = (int*)malloc(res_index * sizeof(int));for (int x = 0; x < res_index; x++) {res_arr[x] = res[x];}free(res);struct MyStruct real_res;real_res.arr = res_arr;real_res.arr_size = res_index;return real_res;
}int main() {int b[8] = { 1,2,2,9,4,4,5,5 };struct MyStruct res = find_odd_occurrence(b, 8);for (int k = 0; k < res.arr_size; k++) {printf("%d\n", res.arr[k]);}free(res.arr);return 0;
}

如上,经历了排序,2层for循环再遍历查找计数,再遍历计数为奇数项的数字,再处理结果,得到了一个通用的获取数组中所有出现奇数次的函数。

再看题2的

#include<stdio.h>int find1odd(int a[], int n) {//要求数组a中只有一个数字出现奇数次,则本函数能快速查找到数组中的这个数int res = 0;for (int i = 0; i < n; i++) {res ^=  a[i];}return res;
}int main() {int a[11] = { 1,1,2,2,2,3,2, 3,4,3,3 };printf("%d\n", find1odd(a, 11));return 0;
}

异或的规则:
(1)相同为0,相异为1
(2) 异或满足交换律,即 a ^ b ^ c = a ^ ( b ^ c) = a ^ c ^ b
(3) N ^ N = 0, N ^ 0 = N;

解读:
数组中出现偶数次的数字异或后通通为0,类似消消乐可以直接划掉,最后只剩下了出现奇数次的数字。

然后我们再看看第三题的

#include<stdio.h>int or2(int a[], int n) {//假设数组a中只有2个数字出现奇数次int res = 0;for (int i = 0; i < n; i++) {res ^=  a[i];}return res;
}int find_right1(int n) {//查找一个数最右边的1,如0b000001100,返回0b000000100return n & (~n + 1);
}int get1fromgroup(int a[], int n, int right1) {//原理是进行2分组,一组和right1中1的位置同样是1,一组是0int res = 0;for (int i = 0; i < n; i++) {if (a[i] & right1) {res ^= a[i];}}return res;
}int main() {int b[8] = { 1,2,2,9,4,4,5,5};int two_or = or2(b, 8);int right1 = find_right1(two_or);int one_odd = get1fromgroup(b, 8, right1);int other_odd = two_or ^ one_odd;printf("%d, %d", one_odd, other_odd);return 0;
}

解读:
数组中出现偶数次的数字异或后直接消失,只剩下2个奇数异或的值,表示为 two_or = x ^ y
假设这个two_or = b00001101,根据相异为1,我们分析1出现的位置x和y只能有一个贡献了1,那么我们可以根据其中任意一位的1对所有数组中的数字进行分组,即此位是1还是0进行分组,那么x和y必然分别出现两个分组里, 然后其它数字不管此位是0还是1,全部是出现了偶数次,所以不管分在那个分组,经过异或后全部抵消掉了。
这里我们选择的是出现在最右侧的1,这里有个小技巧
即 查找一个数最右边的1,可以通过 n & (~n + 1)得到,如获取整数6的最右侧的1
0b0000 0110
取反得到0b1111 1001
再+1得到0b1111 1010
&后 得到 0b0000 0010
(&的规则是两个都为1(真)则1(真),其它全部为0(假))

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

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

相关文章

【算法思考记录】力扣2477. 到达首都的最少油耗【JavaScript,深度优先搜索】

原题链接 到达首都的最少油耗&#xff1a;一种优雅的解决方案 题目解析 这个算法题目描述了一个有趣的场景&#xff1a;一棵由城市和道路组成的树形结构&#xff0c;其中每个节点代表一个城市&#xff0c;边代表道路。所有城市的代表需要前往编号为0的城市——首都参加会议。…

一個Tensor的一生 - torch.rand篇

一個Tensor的一生 - torch.rand篇 前言torch/\_C/_VariableFunctions.pyibacktracePython bindingstorch::autograd::THPVariable_randoperator() C APItorch::rand_symintat::rand_symint dispatchat::_ops::randat::_ops::rand::callnative_functions.yamlat::(anonymous nam…

【人体解剖学与组织胚胎学】练习一高度相联知识点整理及对应习题

文章目录 [toc]骨性鼻旁窦填空题问答题 关节填空题简答题 胸廓填空题简答题![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/827e7d1db3af42858d8734bb81911fea.jpeg)补充 骨性鼻旁窦 填空题 问答题 关节 填空题 简答题 胸廓 填空题 简答题 补充 第二肋对应胸骨…

Leetcode.2477 到达首都的最少油耗

题目链接 Leetcode.2477 到达首都的最少油耗 rating : 2012 题目描述 给你一棵 n n n 个节点的树&#xff08;一个无向、连通、无环图&#xff09;&#xff0c;每个节点表示一个城市&#xff0c;编号从 0 0 0 到 n − 1 n - 1 n−1 &#xff0c;且恰好有 n − 1 n - 1 n−…

什么是呼叫中心的语音通道?呼叫中心语音线路有几种?

什么是呼叫中心的语音通道&#xff1f; 呼叫中心的语音通道是指在呼叫中心中使用的语音信号传输通道&#xff0c;它是呼叫中心中至关重要的一部分&#xff0c;负责将客户的语音信息传递给客服代表&#xff0c;以及将客服代表的语音信息传递给客户。在呼叫中心的运营中&#xf…

JAVA-JVM 之Class字节码文件的组成 【下篇】

字节码 类元数据接口元数据字段元数据方法元数据属性元数据 主页传送门&#xff1a;&#x1f4c0; 传送 类元数据 此部分元数据主要包含类索引&#xff08;This_Class&#xff09;和父类索引&#xff08;Super_Class&#xff09;。 类索引&#xff1a;指向Class字节码常量池表…

回顾一下磁盘管理

目录 一、磁盘概述 1.磁盘表示方法/dev/ 2.分区类型 3.文件系统 4.inode节点 二、磁盘操作 1.查看与添加磁盘 2.分区 2.非交互式 3.fdisk /dev/sdb < part.txt 三、LVM逻辑卷 1、物理卷中的操作命令 2、卷组中的操作命令 3、逻辑卷中的操作命令 一、磁盘概述 …

Python----Pandas

目录 Series属性 DataFrame的属性 Pandas的CSV文件 Pandas数据处理 Pandas的主要数据结构是Series&#xff08;一维数据&#xff09;与DataFrame&#xff08;二维数据&#xff09; Series属性 Series的属性如下&#xff1a; 属性描述pandas.Series(data,index,dtype,nam…

mybatis 的快速入门以及基于spring boot整合mybatis

MyBatis基础 MyBatis是一款非常优秀的持久层框架&#xff0c;用于简化JDBC的开发 准备工作&#xff1a; 1&#xff0c;创建sprong boot工程&#xff0c;引入mybatis相关依赖2&#xff0c;准备数据库表User&#xff0c;实体类User3&#xff0c; 配置MyBatis&#xff08;在applic…

2005-2021年地级市绿色发展注意力数据(根据政府报告文本词频统计)

2005-2021年地级市绿色发展注意力数据&#xff08;根据政府报告文本词频统计&#xff09; 1、时间&#xff1a;2005-2021年 2、指标&#xff1a;省、市、年份、一级指标、关键词、关键词词频、总词频 3、范围&#xff1a;270个地级市 4、来源&#xff1a;地级市政府工作报告…

【C++】动态内存管理——new和delete

这篇文章我们讲一下C的动态内存管理&#xff0c;从一个比较陌生的知识说起&#xff0c;我们知道&#xff0c;一个工程可以创建很多.c文件&#xff0c;我们如果定义一个全局变量&#xff0c;只要用extern声明一下&#xff0c;在每个文件都可以用。而用static修饰的全局变量只能在…

MyBatis动态sql语句

1、if if元素可以用于根据条件判断是否包含某个SQL语句片段。 <!--查询年龄大于18岁且小于等于30岁的用户信息:<if>元素用于判断minAge和maxAge是否为null&#xff0c;如果不为null&#xff0c;则将对应的SQL语句片段拼接到最终的SQL语句中 --> <select id&quo…

【ecology】通过F12抓取页面SQL

1、点击流程监控&#xff0c;打开浏览器的”开发者工具“&#xff08;F12&#xff09;&#xff1b; 2、点击搜索&#xff0c;在开发者工具中找到sessionkey&#xff0c;复制后面的值。 3、http://58.213.83.186:8081/api/ec/dev/table/getxml?dataKey 上面的网址的IP地址修改…

Gee教程6.模板(HTML Template)

这一章节的内容是介绍 Web 框架如何支持服务端渲染的场景 实现静态资源服务(Static Resource)。支持HTML模板渲染。 这一章节很多内容是基于net/http库的&#xff0c;该库已经实现了很多静态文件和HMML模板的相关功能的了。 静态文件 网页的三剑客&#xff0c;JavaScript、C…

代理模式-C++实现

代理模式是一种结构型设计模式&#xff0c;为其他对象提供一种代理以控制对这个对象的访问。在某些情况下&#xff0c;一个对象不适合或者无法引用另一个对象&#xff0c;这个时候就需要一个代理对象充当客户端和目标对象之间的中介。 代理模式就是代理对象具备目标对象的所有…

如何写项目部署文档

编写项目部署文档&#xff0c;这是确保项目顺利部署和上线的重要步骤。 1. 项目概述 在这里简要介绍项目的目的、功能和特点。 2. 系统要求 列出项目部署所需的硬件和软件要求&#xff0c;例如操作系统、Java版本、数据库等。 3. 安装步骤 描述项目的下载和安装步骤&…

看懂lscpu的输出

文章目录 1. lscpu1.1 Architecture1.2 逻辑核心数1.3 缓存1.4 CPU型号1.5 NUMA架构1.5.1 CPU多核架构1.5.2 多CPU Socket架构 2. cat /proc/cpuinfo2.1 关键字段 1. lscpu 通过lscpu查看当前系统的CPU信息。 [hadoopserver3 ~]$ lscpuArchitecture: x86_64 …

第十四周课堂笔记

7.Java语言类的关键技术 7.1类的成员的权限修饰符 private&#xff1a;表示仅能在类的内部访问该成员&#xff0c;无法从类的外部访问该成员 public&#xff1a;表示该成员可以被其他的任何类使用 缺省&#xff1a;表示该成员仅能被同一个包中的类所访问或者调用 7.2方法的…

「词令」2023年12月6日蚂蚁庄园今日问题答案是什么?支付宝蚂蚁庄园今日答案12.6

问题&#xff1a;千页豆腐的主要原料是豆腐吗&#xff1f; 选项&#xff1a;A、不是哦 B、当然是 答案&#xff1a;不是哦 解析&#xff1a;千页豆腐是素食新产品&#xff0c;以大豆分离蛋白和水为主要原料&#xff0c;食用植物油、淀粉等为辅料;添加或不添加稳定剂和凝固剂…

java--接口的其他细节

1.jdk8开始&#xff0c;接口新增了三种形式的方法 ①默认方法(实例方法)&#xff1a;使用用default修饰&#xff0c;默认会被加上public修饰。注意&#xff1a;只能使用接口的实现类对象调用 ②私有方法&#xff1a;必须用private修饰(jdk9开始才支持) ③类方法(静态方法)&a…