C++面试宝典第3题:找不同的数

news2025/1/18 16:45:58

题目

        封装两个函数,分别完成下面的编码任务。

        (1)在一个整型数组中,数字都是两两相同,只有一个不同,请编写代码,最快找出这个不同的数字。

        (2)在一个整型数组中,数字都是两两相同,只有两个不同,请编写代码,最快找出这两个不同的数字。

解析

        我们先看第一道小题,初看题目,觉得不难。遍历数组两遍,不就能找到那个不同的数字了吗?但题目中提到“最快”,当前遍历数组的方法显然并不高效。那么,有更快的方法找出这个不同的数字吗?

        我们可以思考一下异或运算的特点:两个相同的数异或为0,两个不同的数异或不为0,与0异或值不变。另外,异或还满足交换律,a^b^c与a^c^b的值相等。根据这个特点,我们将数组中的所有数字异或一遍:两两相同的数异或为0,0与不同的那个数异或,最终结果即为要找的那个数。根据这个思路,我们给出了第一道小题的示例代码。

#include <iostream>
using namespace std;

int FindNotRepeatNumber(int *pNumber, int nCount)
{
    if (pNumber == NULL || nCount <= 0)
    {
        return 0;
    }

    int nDestNumber = 0;
    for (int i = 0; i < nCount; i++)
    {
        nDestNumber ^= pNumber[i];
    }

    return nDestNumber;
}

int main()
{
    int pNumber1[7] = { 26, 15, 32, 88, 26, 32, 88 };
    cout << FindNotRepeatNumber(pNumber1, sizeof(pNumber1)/sizeof(pNumber1[0])) << endl;

    int pNumber2[] = { 100, 24, 36, 87, 87, 56, 36, 100, 24 };
    cout << FindNotRepeatNumber(pNumber2, sizeof(pNumber2)/sizeof(pNumber2[0])) << endl;

    getchar();
    return 0;
}

        我们再来看第二道小题,与第一道小题不同,数组中有两个不同的数字了,怎么办呢?我们可以猜测一下出题者的出题意图,先出了简单一点的第一小题,然后出了难一点的第二小题,这是否是在暗示我们:第二小题需要根据第一小题的解题思路,再深入思考呢?

        实际上,有了第一小题的结论,我们可以考虑能否将这个数组划分成两个数组,使每个数组中各包含一个只出现了一次的数字。由于有两个数字只出现了一次,故将所有数异或后,结果肯定不为0,其二进制表示中至少有一位为1。可以依据这一位是否相同,将原数组划分成两个数组,从而直接套用第一小题的结论来解题。

        下面,我们给出了第二道小题的示例代码。

#include <iostream>
using namespace std;

void FindTwoNotRepeatNumber(int *pNumber, int nCount, int &nNum1, int &nNum2)
{
    nNum1 = 0;
    nNum2 = 0;
    if (pNumber == NULL || nCount <= 0)
    {
        return;
    }

    int nTotal = 0;
    for (int i = 0; i < nCount; i++)
    {
        nTotal ^= pNumber[i];
    }

    int j = 0;
    for (j = 0; j < sizeof(int) * 8; j++)
    {
        if (((nTotal >> j) & 1) == 1)
        {
            break;
        }
    }

    for (int i = 0; i < nCount; i++)
    {
        if (((pNumber[i] >> j) & 1) == 0)
        {
            nNum1 ^= pNumber[i];
        }
        else
        {
            nNum2 ^= pNumber[i];
        }
    }
}

int main()
{
    int nNum1 = 0;
    int nNum2 = 0;
    int pNumber1[8] = { 26, 15, 32, 88, 26, 100, 32, 88 };
    FindTwoNotRepeatNumber(pNumber1, sizeof(pNumber1)/sizeof(pNumber1[0]), nNum1, nNum2);
    cout << nNum1 << ", " << nNum2 << endl;

    int pNumber2[] = { 100, 24, 36, 87, 87, 63, 56, 36, 100, 24 };
    FindTwoNotRepeatNumber(pNumber2, sizeof(pNumber2)/sizeof(pNumber2[0]), nNum1, nNum2);
    cout << nNum1 << ", " << nNum2 << endl;

    getchar();
    return 0;
}

总结

        通过这道题,我们学习了异或运算的特点,并利用该特点,找出了数组中不同的数。在第二道小题中,我们采用了“分而治之”的思想,将原数组从逻辑上划分成了两个数组,从而顺利找到了两个不同的数。

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

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

相关文章

力扣78. 子集(java 回溯解法)

Problem: 78. 子集 文章目录 题目描述思路解题方法复杂度Code 题目描述 思路 我们易知&#xff0c;本题目涉及到对元素的穷举&#xff0c;即我们可以使用回溯来实现。对于本题目我们应该较为注重回溯中的决策阶段&#xff1a; 由于涉及到对数组中元素的穷举&#xff0c;即在每…

1、Redis变慢原因排查(上)

感觉Redis变慢了&#xff0c;这些可能的原因你查了没 &#xff1f;(上) Redis 作为一款业内使用率最高的内存数据库&#xff0c;其拥有非常高的性能&#xff0c;单节点的QPS压测能达到18万以上。但也正因此如此&#xff0c;当应用访问 Redis 时&#xff0c;如果发现响应延迟变…

Docker架构及常用的命令

一、初识Docker 1、 docker是一个快速交付应用、运行应用的技术&#xff0c;具备下列优势&#xff1a; 可以将程序及其依赖、运行环境一起打包为一个镜像&#xff0c;可以迁移到任意Linux操作系统运行时利用沙箱机制形成隔离容器&#xff0c;各个应用互不干扰启动、移除都可以…

Redis保证高可用的三种方式

Redis保证高可用主要有三种方式&#xff1a;主从、哨兵、集群。 主从复制了解吗&#xff1f; Redis主从复制简图 主从复制&#xff0c;是指将一台 Redis 服务器的数据&#xff0c;复制到其他的 Redis 服务器。前者称为 主节点(master)&#xff0c;后者称为 从节点(slave)。且…

用Rust刷LeetCode之66 加一

66. 加一[1] 难度: 简单 func plusOne(digits []int) []int { length : len(digits) // 从最低位开始遍历&#xff0c;逐位加一 for i : length - 1; i > 0; i-- { if digits[i] < 9 { digits[i] return digits } d…

计算整数各位数字之和 C语言xdoj29

时间限制: 1 S 内存限制: 1000 Kb 问题描述: 假设n是一个由最多9位数字&#xff08;d9, …, d1&#xff09;组成的正整数。编写一个程序计算n的每一位数字之和 输入说明: 输入数据为一个正整数n 输出说明: 对整数n输出它的各位数字之和后换行 输入样例: …

排序算法——桶排序/基数排序/计数排序

桶排序 是计数排序的升级版。它利用了函数的映射关系&#xff0c;高效与否的关键就在于这个映射函数的确定。桶排序 (Bucket sort)的工作的原理&#xff1a; 假设输入数据服从均匀分布&#xff0c;将数据分到有限数量的桶里&#xff0c;每个桶再分别排序&#xff08;有可能再使…

C/C++,数字序列——计算伯努利数(Bernoulli Number)的计算方法与源程序

1 文本格式 typedef long long ll; const int maxn 10000; const int mod 1e9 7; ll B[maxn]; // 伯努利数 ll C[maxn][maxn]; // 组合数 ll inv[maxn]; // 逆元&#xff08;计算伯努利数&#xff09; void init() { // 预处理组合数 for (int i 0;…

PHPstudy小皮的数据库打开失败问题解决

如果你的MYSQL服务启动后停止&#xff0c;多次重启依然无法解决的情况下&#xff0c;大概率是和本地mysql冲突了 但是&#xff0c;千万不要卸载掉本地mysql&#xff0c;只需要在服务中停止本地mysql即可 将此服务关闭&#xff0c;小皮的mysql即可使用

AI助力智慧农业,基于DETR【DEtection TRansformer】模型开发构建田间作物场景下庄稼作物、杂草检测识别系统

智慧农业随着数字化信息化浪潮的演变有了新的定义&#xff0c;在前面的系列博文中&#xff0c;我们从一些现实世界里面的所见所想所感进行了很多对应的实践&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a; 《自建数据集&#xff0c;基于YOLOv7开发构建农田场景下杂草…

学会使用这个魔法棒,再也不用在容器里安装乱七八糟的命令工具了!

在构建镜像的时候&#xff0c;我总是倾向于极简构建&#xff0c;一切没有必要的软件包都不安装&#xff0c;以此来缩小镜像的容量。但是这种做法为后续运维带来了一些困难&#xff0c;如在日常查询、排查问题的时候发现很多命令用不了&#xff0c;不得不在容器中安装额外的命令…

堆栈,BSS,DATA,TEXT

一、目标文件 首先目标文件的构成&#xff0c;Linux下就是.o 文件 编译器编译源码后生成的文件叫目标文件&#xff08;Object File&#xff09;。 目标文件和可执行文件一般采用同一种格式&#xff0c;这种存储格式为 ELF。 目前文件的内容至少有编译后的机器指令代码和数据&a…

【PCB设计】嘉立创EDA器件3D模型导入AD的方法

嘉立创EDA器件3D模型导入AD的方法 一、嘉立创EDA导出3D模型二、CAD编辑3D模型三、AD中加载3D模型 一、嘉立创EDA导出3D模型 在嘉立创EDA中找到对应的元器件&#xff0c;并生成PCB&#xff0c;选择导出3D文件 导出元件step模型 二、CAD编辑3D模型 用FreeCAD打开模型 删除…

SpringSecurity(一)

【第一篇】SpringSecurity的初次邂逅 1.Spring Security概念 Spring Security是Spring采用 AOP思想&#xff0c;基于 servlet过滤器实现的安全框架。它提供了完善的认证机制和方法级的授权功能。是一款非常优秀的权限管理框架。 Spring Security是一个功能强大且高度可定制的身…

Linux——操作系统与进程的基础概念

操作系统与进程的基础概念 本章思维导图&#xff1a; 注&#xff1a;思维导图对应的.xmind和.png文件都已同步导入至资源 1. 操作系统&#xff08;OS&#xff09; 操作系统的基本概念&#xff1a; 操作系统(operator system)简称OS&#xff0c;是一个管理软硬件资源的软件 1.…

honle电源维修UV电源控制器EVG EPS40C-HMI

好乐UV电源控制器维修&#xff1b;honle控制器维修&#xff1b;UV电源维修MUC-Steuermodul 2 LΛmpen D-82166 主要维修型号&#xff1a; EVG EPS 60/120、EVG EPS 100、EVG EPS200、EVG EPS 220、EVG EPS 340、EVG EPS40C-HMI、EVG EPS60 HONLE好乐uv电源维修故障包括&#…

11K+ Star!图解计算机网络、操作系统、计算机组成、数据库!

大家好&#xff0c;我是 Java陈序员。 俗话说得好&#xff0c;面试造火箭&#xff0c;入职拧螺丝。我们在工作中&#xff0c;其实很少用到一些计算机底层知识&#xff0c;往往只要编码完事。但是&#xff0c;知其然还要知其所以然&#xff0c;我们不仅要做一个合格的“CV 工程…

luceda ipkiss教程 41:画跑道型微环

利用picazzo库中的方向耦合器绘制跑道型微环&#xff1a; from si_fab import all as pdk from ipkiss3 import all as i3 from picazzo3.wg.dircoup import StraightDirectionalCouplerclass RingResonator(i3.PCell):trace_template i3.TraceTemplateProperty(defaultpdk.Si…

[Geek Challenge 2023] klf_2详解

考点 SSTI、join拼接绕过 fuzz测试后发现过滤了很多关键字 我们先试试构造__class__ {% set podict(po1,p2)|join()%} //构造pop {% set alipsum|string|list|attr(po)(18)%} //构造_ {% set cl(a,a,dict(claa,ssa)|join,a,a)|join()%} //构造__class__ {% set …

『TypeScript』深入理解TypeScript基本类型及其应用

&#x1f4e3;读完这篇文章里你能收获到 掌握TypeScript的基本及高级数据类型掌握TypeScript的类型系统 文章目录 一、基本类型1. 类型声明2. 基本数据类型2.1 数字&#xff08;Number&#xff09;2.2 字符串&#xff08;String&#xff09;2.3 布尔值&#xff08;Boolean&…