单身狗问题

简介: 单身狗问题

一、寻找一个单身狗🐶

1、题目描述

在一个整数数组中,有一个数只出现一次,别的数都出现两次,请找出只出现一次的数字。

2、思路分析

面对这样的问题, 可能首先想到的是对数组的元素进行遍历,记录每个元素出现的次数,然后找到只出现一次的数字,但是有一种更为巧妙的方法,就是对遍历数组元素并进行异或运算,异或运算有如下所示的性质,利用异或运算自反的性质就找到那个单身的数字。

3、代码实现

#include<stdio.h>
void single_dog(int num[], int n)
{
    int a = 0;//0与任何数异或为那个数本身
    for (int i = 0; i < n; i++)
    {
        a ^= num[i];
    }
    printf("单身狗为:%d", a);
}
int main()
{
    int num[5] = { 2,1,2,1,4 };
    single_dog(num, 5);
}

运行结果:

二、寻找两个单身狗🐶🐶

1、题目描述

在一个整型数组中,有两个数只出现了一次,别的数都出现了两次 ,请找出这两个仅出现一次的数。

2、思路分析

这个问题如果继续采用上面直接遍历数组进行异或运算的话就只能得到这两个单身狗异或运算后的结果,那么我们可以换个角度思考,我们可以将这两个单身狗分别分到两个不同的组,然后对这两个组分别进行异或 来求,那么该怎么分组呢?

假设数组中的两个单身狗是4和5,那么我们对这两个数进行异或:

我们可以从位异或结果第一个为1的 位置进行分组,因为代表这两个数字在这一位必然是一个为0,另一个为1,然后将这两个数分到两个不同的数组中,然后再进行位异或就可以得到这两个单身的数字了。

3、代码实现

#niclude<stdio.h>
void single_dog2(int num[], int n)
{
    int a = 0;//0与任何数异或为那个数本身
    int pos = 0;
    for (int i = 0; i < n; i++)
    {
        a ^= num[i];
    }
    for (int i = 0; i < 32; i++)
    {
        if ((a >> i) & 1 == 1)
        {
            pos = i;
            break;
       }
    }
    int b = 0, c = 0;
    for (int i = 0; i < n; i++)
    {
        if ((num[i] >> pos) & 1 == 1)
        {
            b ^= num[i];
        }
        else
        {
            c ^= num[i];
        }
    }
    printf("两个单身狗为:%d %d\n", b, c);
 
}
int main()
{
    int num[8] = { 2,4,2,1,4,5,5,6 };
    single_dog2(num, 8);
}

运行结果:

 


目录
相关文章
|
Prometheus 监控 Cloud Native
夜莺自定义告警模板
夜莺自定义告警模板
|
分布式计算 DataWorks 调度
DataWorks产品使用合集之数据地图里如何导出某个工作空间下的所有表明细
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
230 24
|
Linux 知识图谱
Centos7安装killall,fuser, killall,pstree和pstree.x11
通过上述步骤,您已在CentOS 7系统中成功部署了killall、fuser、pstree以及pstree.x11,为高效管理系统进程打下了坚实基础。更多关于服务器管理与优化的知识,获取全面技术支持与解决方案。
515 1
|
传感器 人工智能 监控
【基于开源鸿蒙(OpenHarmony)的智慧农业综合应用系统】
【基于开源鸿蒙(OpenHarmony)的智慧农业综合应用系统】
1010 6
|
机器学习/深度学习 数据采集 算法
利用未标记数据的半监督学习在模型训练中的效果评估
本文将介绍三种适用于不同类型数据和任务的半监督学习方法。我们还将在一个实际数据集上评估这些方法的性能,并与仅使用标记数据的基准进行比较。
992 8
|
前端开发 Java Spring
`DeferredResult`用法简单介绍
`DeferredResult`用法简单介绍
394 1
|
存储 机器学习/深度学习 缓存
【数据挖掘】XGBoost面试题:与GBDT的区别?为什么使用泰勒二阶展开?为什么可以并行训练?为什么快?防止过拟合的方法?如何处理缺失值?
XGBoost与GBDT的区别、XGBoost使用泰勒二阶展开的原因、并行训练的原理、速度优势、防止过拟合的策略以及处理缺失值的方法,突出了XGBoost在提升模型性能和训练效率方面的一系列优化。
851 1
|
数据安全/隐私保护 Windows
支付系统08-----支付宝支付---接入准备----创建应用,如果你有营业执照,网站有备案,就可以进行接入,真实的企业用户在做的时候,也可以用沙箱进行隔离,设置独立环境,隔离线上模式进行调试
支付系统08-----支付宝支付---接入准备----创建应用,如果你有营业执照,网站有备案,就可以进行接入,真实的企业用户在做的时候,也可以用沙箱进行隔离,设置独立环境,隔离线上模式进行调试
|
数据挖掘 数据处理 索引
数据合并与连接:Pandas中的强大数据整合功能
【4月更文挑战第16天】Pandas是Python数据分析的库,提供数据合并与连接功能。本文聚焦于`merge`和`concat`函数。`merge`基于键合并DataFrame,如示例中`df1`和`df2`按&#39;key&#39;列合并,支持多种连接方式。`concat`则沿轴堆叠DataFrame,如`df3`和`df4`沿行连接。注意合并连接时键的一致性、选择合适连接方式及处理索引和数据结构,以确保数据准确一致。学习这些方法能有效整合多数据源,便于分析。