C:每日一练:单身狗(2.0版本)

news2024/9/22 0:42:21

前言:

今天在刷题的时候突然看到一道题疑似一位故题。仔细一看,欸!这不是就是单身狗的升级版吗?我想那必须再安排一篇,不过由于本篇文章与上一篇单身狗文章所涉及的知识点基本相同,所以还请大家见谅!

我写的开心,大家也看个乐呵!不过还请单身的人不要介意,单纯觉得比较有意思,无意冒犯!毕竟连小编自己都是单身狗。

后续小编也会尽快更新完指针相关知识点!

一、题目:

在一场专为情侣们策划的盛宴中,竟然有两名单身者悄然混入。宴会的主人感到十分不悦,并寻求你的帮助,希望你能运用你敏锐的洞察力,协助她识破并找出这两名不合规矩的单身者。

(无意冒犯,只是提供一个题目的背景)

例如:

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

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

二、代码展示(无注释的)

如果有想先自己思考的可以先看一看这个代码,后面也会有解析

#include <stdio.h>
int find(int num) {
    int index = 0;
    while ((num & 1) == 0 && index < 32) {
        num >>= 1;
        index++;
    }
    return index;
}
void single(int arr[], int sz, int* n1, int* n2) {
    int Re = 0;
    for (int i = 0; i < sz; i++) {
        Re ^= arr[i];
    }
    int index = find(Re);
    *n1 = *n2 = 0;
    for (int i = 0; i < sz; i++) {
        if (((arr[i] >> index) & 1) == 1) 
            *n1 ^= arr[i];    
        else 
            *n2 ^= arr[i];
  
}
int main() {
    int arr[] = {1,2,3,4,5,6,1,2,3,4,5,7};
    int n1, n2;
    int sz = sizeof(arr) / sizeof(arr[0]);
    single(arr, sz, &n1, &n2);
    printf("两只单身狗分别是:%d 和 %d\n", n1, n2);
    return 0;
}

三、题解思路:

1.关于算法,我们依然使用的是异或运算,因为异或运算相同为0,所以将数组中所有的数字进行异或操作,最终得到的结果就是那两个只出现一次的数字的异或值。

例如:

举个例子: int arr[ ] = {1,1,2}

初始re = 0;

re = re ^ 1 = 1;此时re = 1;

re = re ^ 1 = 1 ^ 1 = 0;此时re = 0;

re = re ^ 2 = 0 ^ 2 = 2;此时re = 2;所以只出现一次的数字是2

2.找到这个异或结果中为 1 的某一位。根据异或运算不同为1,这一位为 1 说明在这一位上,那两个只出现一次的数字是不同的。

例如:数组{1,1,2}
异或运算:1^1^2 = 2;
0010   2的二进制
 异或的结果是0010,从右向左找1的位置
0000   0的二进制
0010   2的二进制
0000^0010 = 0010 (异或运算相同为0,不同为1)
我们可以发现0在这一位上的数字是0,2在这一位上的数字是2,说明结果为1的这一位,两个只出现一次的数字是不同的。

3.根据这一位将数组中的数字分为两组。一组是这一位为 1 的数字,另一组是这一位为 0 的数字。

再对这两组数字分别进行异或操作,就可以得到那两个只出现一次的数字。

例如,数组为{1,2,3,1,2,4}

第一步,将所有数字异或:1 ^ 2 ^ 3 ^ 1 ^ 2 ^ 4=6 (二进制为0110 )

第二步,找到异或结果中为 1 的一位,从右往左数第二位为 1 

第三步,根据这一位将数字分组:

  • 这一位为 1 的数字:{3,4}
  • 这一位为 0 的数字:{1,2,1,2}

四、函数介绍

1.main函数

int main() 
{
    int arr[] = {1,2,3,4,5,6,1,2,3,4,5,7};
    int n1, n2;
    int sz = sizeof(arr) / sizeof(arr[0]);
    single(arr, sz, &n1, &n2);
    printf("两只单身狗分别是:%d 和 %d\n", n1, n2);
    return 0;
}
  •  数组的输入:int arr[] = {1,2,3,4,5,6,1,2,3,4,5,7};
  • 数组元素个数计算: int sz = sizeof(arr) / sizeof(arr[0]);
  • 调用函数: single(arr, sz, &n1, &n2);

2.single函数

void single(int arr[], int sz, int* n1, int* n2) {
    int Re = 0;
    for (int i = 0; i < sz; i++) {
        Re ^= arr[i];
    }
    int index = find(Re);
    *n1 = *n2 = 0;
    for (int i = 0; i < sz; i++) {
        if (((arr[i] >> index) & 1) == 1) {
            *n1 ^= arr[i];
        }
        else {
            *n2 ^= arr[i];
        }
    }
}

single函数作用:找出数组中两个只出现一次的数字

第一个for循环实现数组中所有元素的异或运算

第二个for循环用于根据索引值,将数组分为两组并分别进行异或运算

 int index = find(Re);将索引值传给find函数

3.find函数

int find(int num) {
    int index = 0;
    while ((num & 1) == 0 && index < 32) {
        num >>= 1;
        index++;
    }
    return index;
}

 find函数用于找到一个数的二进制表示中从右往左第一个为 1 的位的索引

五:代码展示(含注释)

#include <stdio.h>
int find(int num)
    int index = 0;
   
    while ((num & 1) == 0 && index < 32)  // 当前二进制位为 0 并且索引小于 32
    {
        
        num >>= 1;//实现二进制中每位检查
        index++;
    }
    return index;// 返回第一个结果为 1 的位的索引
}
void single(int arr[], int sz, int* n1, int* n2) 
    int Re = 0;
    // 对数组中所有数字进行异或操作,得到两个只出现一次数字的异或结果
    for (int i = 0; i < sz; i++) 
    {
        Re ^= arr[i];
    }
    int index = find(Re);// 找到上述异或结果中第一个为 1 的位的索引
    *n1 = *n2 = 0;
    // 根据找到的索引位,将数组数字分为两组并分别异或
    for (int i = 0; i < sz; i++) 
    {
        if (((arr[i] >> index) & 1) == 1) // 判断当前数字在指定索引位是否为 1
            *n1 ^= arr[i];   
        else 
            *n2 ^= arr[i];  
    }
}
int main() 
{
    int arr[] = { 1, 2, 3, 2, 1, 4 };
    int n1, n2;
    int sz = sizeof(arr) / sizeof(arr[0]);//计算数组元素
    single(arr, sz, &n1, &n2);//函数调用
    printf("两只单身狗分别是:%d 和 %d\n", n1, n2);
    return 0;
}

 

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

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

相关文章

小型企业客户关系管理系统pf

TOC springboot457小型企业客户关系管理系统pf 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff0…

推送本地windows环境镜像到阿里云镜像仓库

说明&#xff1a;从dockerhub拉取了apache/kafka3.7.0镜像到本地windwos操作系统上&#xff0c;再将该镜像推送到阿里云镜像仓库&#xff0c;记录了本次操作过程。 1、启动本地的docker desktop&#xff0c;搜索官方镜像 将搜索到的apache/kafka官方镜像拉取到本地 镜像拉取…

代码随想录算法训练营_day18

题目信息 530. 二叉搜索树的最小绝对差 题目链接: https://leetcode.cn/problems/minimum-absolute-difference-in-bst/description/题目描述: 给你一个二叉搜索树的根节点 root &#xff0c;返回 树中任意两不同节点值之间的最小差值 。 差值是一个正数&#xff0c;其数值等…

SpringBoot基础(二):配置文件详解

SpringBoot基础系列文章 SpringBoot基础(一)&#xff1a;快速入门 SpringBoot基础(二)&#xff1a;配置文件详解 目录 一、配置文件分类二、配置文件优先级1、不同版本优先级2、不同位置优先级 三、配置文件格式1、yml和yaml格式1.1、字符串1.2、布尔类型1.3、整数型1.4、浮点…

论文阅读笔记:The Graph Neural Network Model

论文来源 IEEE Transactions on Neural Networks&#xff0c;Volume: 20 Issue: 1 背景 图神经网络模型本身具有广泛的使用背景&#xff0c;由于我个人研究交通流量预测的需要&#xff0c;此处仅考虑深度学习领域。图结构指的是由节点node和若干个连接的边edge组成的一种数据…

【Docker】Docker Compose(容器编排)

一、什么是 Docker Compose docker-compose 是 Docker 官方的开源项目&#xff0c;使用 python 编写&#xff0c;实现上调用了 Docker 服务的 API 进行容器管理及编排&#xff0c;其官方定义为定义和运行多个 Docker 容器的应用。 docker-compose 中有两个非常重要的概念&…

关于Python3项目中依赖包管理问题

背景&#xff1a;最近在使用Python3.11编写脚本来获取google play中app的用户评论&#xff0c;脚本中需要安装多个依赖包&#xff0c;在本地Pycharm调试通过以后&#xff0c;上传到github&#xff0c;然后在linux服务器拉取脚本来运行&#xff0c;发现存在几个问题。本文将面临…

【海贼王航海日志:前端技术探索】一篇文章带你走进JavaScript(三)

目录 1 -> WebAPI背景知识 1.1 -> 什么是WebAPI 1.2 -> 什么是API 1.3 -> 什么是DOM 1.3.1 -> DOM树 2 -> 获取元素 2.1 -> querySelector 2.2 -> querySelectorAll 3 -> 事件初识 3.1 -> 基本概念 3.2 -> 事件三要素 4 -> 操…

Apache Tomcat 信息泄露漏洞CVE-2024-21733、CVE-2024-24549和CVE-2024-34750排查处理

一、漏洞描述 Apache Tomcat作为一个流行的开源Web服务器和Java Servlet容器并用于很多中小型项目的开发中。其中,Coyote作为Tomcat的连接器组件,是Tomcat服务器提供的供客户端访问的外部接口,客户端通过Coyote与服务器建立链接、发送请求并且接收响应。 近日发现Apache To…

政企单位如何选择适合规模的即时通讯软件?

政企单位在不同规模的组织结构中都面临着沟通和协作的挑战。为了提高工作效率和团队协作能力&#xff0c;选择适合规模的即时通讯软件至关重要。本文将为政企单位在选择适合规模的即时通讯软件时提供一些关键要素和指导&#xff0c;同时重点介绍WorkPlus作为一个可以迎合政企单…

Java语言程序设计——篇十四(1)

&#x1f33f;&#x1f33f;&#x1f33f;跟随博主脚步&#xff0c;从这里开始→博主主页&#x1f33f;&#x1f33f;&#x1f33f; 欢迎大家&#xff1a;这里是我的学习笔记、总结知识的地方&#xff0c;喜欢的话请三连&#xff0c;有问题可以私信&#x1f333;&#x1f333;&…

34_Web漏洞扫描工具、常见Web漏洞扫描工具、AWVS的部署与使用、 渗透测试执行流程、AWVS破解

Web漏洞扫描工具 Web漏洞扫描是在Web信息收集的基础上&#xff0c;进行更进一步的自动化的安全评估、漏洞挖掘、渗透测试 Web漏洞扫描会出现漏报&#xff0c;需要手工结合使用 常见Web漏洞扫描工具 AWVS、OWASP ZAP、Arachni、Nitko、Paros... 渗透测试执行流程&#xff1a…

IDEA研究院编程语言MoonBit发布beta预览版,快速实现多领域应用

MoonBit beta 预览版比大部分主流语言更早推出现代化泛型、精准错误处理和高效迭代器等重要特性&#xff0c;在云计算、边缘计算、人工智能和教育等领域快速实现落地应用。Beta 预览版标志着 MoonBit 生态进入全新阶段&#xff0c;为用户提供更稳定、流畅的创新操作体验。 Moo…

C++入门——03内存管理

上图为C语言的内存管理&#xff0c;C中可以继续使用&#xff0c;但有些地方就无能为力而且使用起来比较麻烦&#xff0c;因此C又提出了自己的内存管理方式&#xff1a;通过new和delete操作符进行动态内存管理。 1.new和delete操作符 1.1.new/delete操作内置类型 注意&#xf…

自闭症青年的行为特征有哪些

自闭症&#xff0c;又称孤独症&#xff0c;是一种神经发育障碍&#xff0c;它不仅影响儿童的成长&#xff0c;也会在青年时期展现出一系列独特的行为特征。了解这些特征对于更好地支持和帮助自闭症青年融入社会至关重要。 社交互动方面的困难是自闭症青年较为显著的特征之一。他…

IO进程(学习)2024.8.17

目录 文件属性获取 目录操作 标准IO 和文件IO 的区别 库 库的定义 库的分类 静态库 动态库 库的制作 制作静态库 动态库的制作 使用库 进程 程序和进程的区别 程序&#xff1a;编译好的可执行文件 进程&#xff1a;一个独立的可调度的任务 特点 进程段 进程…

SMS流媒体服务器-MPEG-PS流的深度解析

1.简介 ps流的解析&#xff0c;只要按照标准文档对照16进制的流数据&#xff0c;基本都能看的明白。但是实际项目中会碰到各种各样的问题。本文将对如何高效的解析出音视频数据发表一下个人的看法。 介绍一下本人的开源流媒体&#xff0c;点个star&#xff0c;有兴趣一起开发的…

应急响应:勒索病毒-实战 案例一.【Windows 系统-排查和解密】

什么是勒索病毒. 勒索病毒是一种恶意软件&#xff0c;它通过加密用户的数据或锁定用户设备&#xff0c;然后要求用户支付赎金以解锁数据或系统。勒索病毒的入侵方式多样&#xff0c;包括网络共享文件、捆绑传播、垃圾邮件、水坑攻击、软件供应链传播、暴力破解、利用已知漏洞攻…

javaweb_08:Mybatis入门(基于Springboot)

javaweb_08&#xff1a;Mybatis入门 一、引入二、快速入门&#xff08;一&#xff09;准备工作1、创建Springboot工程2、创建user数据库3、创建实体类 &#xff08;二&#xff09;引入MyBatis相关依赖&#xff0c;配置MyBatis。&#xff08;三&#xff09;编写SQL语句&#xff…

动态路由OSPF基础学习笔记一

由于静态路由由网络管理员手工配置&#xff0c;因此当网络发生变化时&#xff0c;静态路由需要手动调整&#xff0c;这制约了静态路由在现网大规模的应用。 动态路由协议因其灵活性高、可靠性好、易于扩展等特点被广泛应用于现网。在动态路由协议之中&#xff0c;OSPF&#xf…