【巧用异或】单身狗2题解

 ✨✨欢迎大家来到Celia的博客✨✨

🎉🎉创作不易,请点赞关注,多多支持哦🎉🎉

所属专栏:【每日刷题】C语言

个人主页:Celia's blog~

 题目

一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。

编写一个函数找出这两个只出现一次的数字。

例如:

有数组的元素是:1,2,3,4,5,1,2,3,4,6

只有5和6只出现1次,要找出5和6.

解题思路 

 这道题可以巧用异或的方式来解答,在此之前,让我们先来了解异或操作符的运算法则:

异或(^):用二进制形式对比两个变量的每一位,如果不同则为1,如果相同则为0。

我们可以得到以下重要推论:

  • n^n=0
  • 0^n=n

 了解了异或操作符的运算法则后,我们可以在此基础上列出此题的大致思路:

先简化一下问题:

如果有一个数组其中只有一个元素单独出现,其他都是成对出现,找出单独出现的元素。

int arr[]={1,2,3,4,5,1,2,3,4};

我们可以遍历这个数组的每一个元素进行异或操作:

int sz = sizeof(arr)/sizeof(int);
int i, ret = 0;//ret初始化为0,这样能保证ret^arr[0]的值为数组第一个元素
for(i = 0; i < sz; i++)
{
    ret ^= arr[i];
}

异或运算符是符合交换律的,遍历一次后相当于上图的操作,最后剩下的就是只出现一次的数字了。

这个简化后的版本和本题的区别是:简化的版本只有一个元素单独出现,本题有两个元素单独出现。我们只需要把本题中的数组分为两组,每一组只有一个元素单独出现,每一组都利用上文的方法,就可以解决此题。那么问题又来了,该按何种方法进行分组呢?

以下是大致思路:

  1. 既然有两个数单独出现,那么单独出现的这两个数一定是不同的两个数。
  2. 既然是不同的两个数,在二进制位上一定有一个或者多个位数是不同的。
  3. 我们可以记录这两个数到底是在第几位二进制数位上是不同的,并且找出其中一个的位置。
  4. 按照这个位置为0或者为1对数组中所有的数进行分组。

有了解题思路,那就先进行第一步:找出这两个数在二进制位上哪个位置是不同的。我们仍然可以遍历数组的每一个元素进行异或操作,这样一来,成对出现的数字互相异或的结果为0,最后剩下的就是两个不同数字异或的结果,这个结果在二进制位上 ‘1’ 的位置就是我们要找的位置。

int arr[]={1,2,3,4,5,1,2,3,4,6};
//5和6只出现一次,其他数字成对出现
int sz = sizeof(arr)/sizeof(int);
int i, ret = 0;
for(i = 0; i < sz; i++)
{
    ret ^= arr[i];//最后是5^6的结果
}

 接下来我们要确定这两个数在二进制的第几位是不同的,确定其中一个位置即可

 for (i = 0; i < 32; i++)//最多有32位
 {
     if (((ret >> i) & 1) == 1)//右移检查每一个二进制位,与1按位与如果等于1,说明这个二进制位为1
     {
        //ret二进制位上的‘1’即为两个数二进制位上的不同之处
         flag++;//二进制位上的数只有0和1两种可能,找到一个不同之处即可,凭此即可区分两个数。
         break;
     }
 }
//以下代码为自定义函数中的代码片段
for (i = 0; i < sz; i++)
{
    if (((arr[i] >> flag) & 1) == 1)//将数组中的每一个元素右移flag位进行判断
    {
        *p1 ^= arr[i];//p1最终的结果将保存第一个单独出现的数,p1初值为0
    }
    else
        *p2 ^= arr[i];//p2最终的结果将保存第二个单独出现的数,p2初值为0
}

这样就变相的将数组中的元素分为两组分别进行遍历异或操作,最终得出结果。

完整代码

#include <stdio.h>
void find_dog2(int arr[10], int* p1, int* p2,int sz)
{
    int i, flag = 0, n = 0;
    for (i = 0; i < sz; i++)
    {
        n ^= arr[i];
    }
    for (i = 0; i < 32; i++)
    {
        if (((n >> i) & 1) == 1)
        {
            flag++;
            break;
        }
    }
    for (i = 0; i < sz; i++)
    {
        if (((arr[i] >> flag) & 1) == 1)
        {
            *p1 ^= arr[i];
        }
        else
            *p2 ^= arr[i];
    }
}
int main()
{
    int arr[10] = { 1,2,3,4,5,1,2,3,4,6 };
    int p1 = 0, p2 = 0;
    int sz = sizeof(arr) / sizeof(int);
    find_dog2(arr, &p1, &p2,sz);
    printf("第一个数字是:%d,第二个数字是:%d", p2, p1);
    return 0;
}

以上就是本题题解的全部内容啦~

如果觉得有所收获的话,记得点赞关注支持一下~

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

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

相关文章

应对手机数据丢失的5大安卓数据恢复软件

我们都去过那里。您的手机上的数据丢失了&#xff0c;现在无法恢复。这尤其令人恐惧&#xff0c;因为我们的手机上都有如此多的信息。从图片、应用程序、个人信息&#xff0c;甚至是来自可能已不复存在的亲人的短信和语音邮件。这种情况确实发生了&#xff0c;而且也不仅仅是An…

【Java程序设计】【C00239】基于Springboot的漫画之家管理系统(有论文)

基于Springboot的漫画之家管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的漫画之家系统 本系统分为系统功能模块、管理员功能模块以及用户功能模块。 系统功能模块&#xff1a;在系统首页可以查看首页&a…

【Tomcat与网络3】Tomcat的整体架构

目录 1.演进1&#xff1a;将连接和处理服务分开 2演进2&#xff1a;Container的演进 3 再论Tomcat的容器结构 4 Tomcat处理请求的过程 5 请求的处理过程与Pipeline-Valve管道 在前面我们介绍了Servlet的基本原理&#xff0c;本文我们结合Tomcat来分析一下如何设计一个大型…

Flutter开发2:安装Flutter

在本篇博客中&#xff0c;我们将详细介绍如何安装Flutter开发环境。安装Flutter是开始使用Flutter进行跨平台移动应用开发的第一步。让我们开始吧&#xff01; 官方安装文档 步骤1&#xff1a;下载Flutter SDK 打开浏览器&#xff0c;访问Flutter官方网站&#xff1a;https://…

latex multirow学习

今天搞了一晚上的这个multirow&#xff0c;总算弄出来了几个比较好的例子&#xff0c;主要是这个multirow的语法我没看懂&#xff0c;这个逻辑我是没理解&#xff0c;就很尴尬&#xff0c;一改就报错&#xff0c;只能先弄几个例子&#xff0c;自己慢慢试 \documentclass{artic…

Apache Doris 整合 FLINK CDC + Iceberg 构建实时湖仓一体的联邦查询

1概况 本文展示如何使用 Flink CDC Iceberg Doris 构建实时湖仓一体的联邦查询分析&#xff0c;Doris 1.1版本提供了Iceberg的支持&#xff0c;本文主要展示Doris和Iceberg怎么使用&#xff0c;大家按照步骤可以一步步完成。完整体验整个搭建操作的过程。 2系统架构 我们整…

vscode实时预览markdown效果

安装插件 Markdown Preview Enhanced 上面是搜索框 启动预览 右键->Open Preview On the Side 效果如下&#xff1a; 目录功能 目录功能还是使用gitee吧 push后使用gitee&#xff0c;gitee上markdown支持侧边生成目录

深度学习环境配置:Anaconda 安装和 pip 源

conda是一种通用包管理系统&#xff0c;与pip的使用类似&#xff0c;环境管理则允许用户方便地安装不同版本的python并可以快速切换。 Anaconda则是一个打包的集合&#xff0c;里面预装好了conda、某个版本的python、众多packages、科学计算工具等等&#xff0c;就是把很多常用…

阿里云a10GPU,centos7,cuda11.2环境配置

Anaconda3-2022.05-Linux-x86_64.sh gcc升级 centos7升级gcc至8.2_centos7 yum gcc8.2.0-CSDN博客 paddlepaddle python -m pip install paddlepaddle-gpu2.5.1.post112 -f https://www.paddlepaddle.org.cn/whl/linux/mkl/avx/stable.html 报错 ImportError: libssl.so…

【Java程序设计】【C00187】基于SSM的旅游资源网站管理系统(论文+PPT)

基于SSM的旅游资源网站管理系统&#xff08;论文PPT&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于ssm的旅游资源网站 本系统分为前台系统、用户和管理员3个功能模块。 前台系统&#xff1a;当游客打开系统的网址后&#xff0c;首先看到的就是…

SQL注入

SQL分类 一.根据注入的方式来分类: 1.get注入 2.post注入 3.cookie注入 二注入方式来分类 1.有回显的注入 2.盲注 3.二次注入 4.报错注入 5堆叠注入 6宽字节注入 简单检测一下 利用单引号或者双引号或者\来检测是否存在注入&#xff0c;如果爆出sql错误或者出现不回显90%…

【go语言】error 错误处理详解

前言 在软件开发中&#xff0c;错误码是一种重要的信息传递方式&#xff0c;对于开发者和用户都具有重要的意义。一般情况下&#xff0c;系统出现故障&#xff0c;由运维在狂轰滥炸的报警信息中找到关键错误信息和研发人员进行沟通&#xff0c;再查看代码逻辑理清问题根源&…

git小白进阶之路

git是最常用的版本控制工具&#xff0c;我对其进行了整理后续补充&#xff0c;这个文档欢迎大家来讨论&#xff0c;当前我的视频梳理&#xff1a; git小白进阶之路_哔哩哔哩_bilibili&#xff0c;非常希望大佬们能够批评指正&#xff0c;并多多交流。 目录 初始配置 配置账号…

上位机图像处理和嵌入式模块部署(视频处理vs图像处理)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 从目前发展的情况来看&#xff0c;视频处理会慢慢变成一种主流趋势。这里面的原因很多&#xff0c;比如说现在嵌入式soc的算力越来越强、获取图像的…

如何用gpt快速做好数据分析?

由于技术限制&#xff0c;目前InfinitePaper AI仅支持上传1份文件&#xff0c;且大小不超过10M。但是&#xff0c;在强大的代码解释器面前&#xff0c;这都是小问题。我们只需要将可能用到的文件打包成压缩文件上传即可&#xff0c;之后要求GPT直接解压就能正常完成后续需求。 …

Docker进阶篇-Docker网络

一、描述 1、docker不启动&#xff0c;默认网络情况 查看网卡情况使用&#xff0c;ifconfig或者ip addr ens33&#xff1a;本机网卡 lo&#xff1a;本机回环网络网卡 virbr0:在CentoS 7的安装过程中如果有选择相关虚拟化的的服务安装系统后&#xff0c;启动网卡时会发现 …

政安晨的机器学习笔记——示例演绎在TensorFlow中使用 CSV数据(基于Colab的Jupyter笔记)(1.5万字长文超详细)

本笔记提供了如何在 TensorFlow 中使用 CSV 数据的示例&#xff1a;用 tf.data 加载 CSV 数据。 其中包括两个主要部分&#xff1a; 从磁盘加载数据将数据预处理为适合训练的形式。 本笔记侧重于加载&#xff0c;并提供了一些关于预处理的快速示例。 设置 import pandas a…

2024美国大学生数学建模竞赛美赛B题matlab代码解析

2024美赛B题Searching for Submersibles搜索潜水器 因为一些不可抗力&#xff0c;下面仅展示部分代码&#xff08;很少部分部分&#xff09;和部分分析过程&#xff0c;其余代码看文末 Dthxlsread(C:\Users\Lenovo\Desktop\Ionian.xlsx); DpDth(:,3:5); dy0.0042; dx0.0042; …

【Spring实战】33 Spring Boot3 集成 Nacos 配置中心

文章目录 1. 配置中心定义2. 解决哪些问题3. 常用的配置中心4. 使用示例1&#xff09;没引入 Nacos 配置中心2&#xff09;引入依赖3&#xff09;配置Nacos连接信息4&#xff09;在 Nacos 上配置属性5&#xff09;在 Spring Boot 中使用配置6&#xff09;启动服务&验证7&am…

HiFT全参数微调新范式---逐层微调

论文链接: https://arxiv.org/abs/2401.15207 HiFT 是一个端到端的层级优化策略。目前论文的结果是原始混合精度的结果&#xff0c;目前最新进展已将混合精度进行了分层适配&#xff0c;微调7B模型的内存需求约为16.87G&#xff0c;13B模型约为31G(batch1,seq_length512) 背景…