在 C++ 中通过翻转 K 个唯一位找到原始数字2024 年 8 月 29 日 | 5 分钟阅读 引言在 C++ 中通过翻转 K 个独特点来找到原始数字是一个有趣的问题,它涉及数字编码的解释和其中某些位的转换。在数字世界中,每个整数都以二进制表示,即由 0 和 1 组成的二进制数字。翻转一个位意味着在两侧都有 0,而改变方法试图将 0 变为 1,或将 1 变为 0。问题是在执行了特定数量的位翻转后,推断出初始数字。 假设您被赋予三个数字 X、Y 和 Z,它们被声称是通过翻转 K 个独特点从一个未知的原始数字中创建的。目标是解开谜团并找出那个初始数字是什么。这通过 C++ 编程实现——一种用于此类计算挑战的强大且广泛使用的语言。 这些步骤包括位运算,它允许操作数字二进制形式中存在的单个位。该算法验证两个给定数字二进制形式中翻转位的位置。通过考虑这些数字之间的关系,可以确定翻转位置的共同模式,然后可以重建原始数字。 这个问题不仅是一个计算难题,而且意义重大。它对计算机科学和密码学等不同领域具有实际价值,在这些领域中,理解和塑造二进制表示是基础。解决方案需要系统的逻辑思维方法和使用程序概念,这将有助于穿越二进制领域。 程序输出 25 说明
辅助函数以 X 和 Y 两个整数作为其输入参数。它旨在定位 X 和 Y 的二进制表示之间发生位反转的索引。它使用按位 **XOR (^) **来确定一个数字 (ans),其 1(设置位)构成 X 和 Y 对应的位不同的位置的坐标。 对于 ans 中设置的每个位 (1),函数遍历 32 位 ans,并将其位置添加到集合 (flippedPositions)。
**findOriginalNumber** 函数接收三个整数值 (X、Y 和 Z) 和一个整数值 K 作为参数。它使用辅助函数来确定 X 和 Y (集合 A) 之间以及 X 和 Z (集合 B) 之间位反转的位置。它枚举集合 A 和 B 中位翻转的共享位置,并将它们保存在一个集合 (commonPositions) 中。 然后函数遍历共同位置,并使用按位 XOR 切换原始数字 X 中相应的位。输出是 X 的最终值。
在主函数中,调用 findOriginalNumber 函数,参数为 9、17、29 和 I。输出打印到控制台。
执行时,给定代码将 findOriginalNumber 函数及其关联参数 (9, 17, 29, 1) 的结果打印到控制台。 总的来说,代码旨在找到原始数字 (X),给定三个数字 (X、Y 和 Z),其中 X、Y 和 Z 中的每一个都是通过翻转原始数字中的 K 个独特点获得的。使用辅助函数来确定位反转的位置,并利用 findOriginalNumber 函数根据这些位置恢复原始数字。 复杂度分析 给定代码的时间复杂度和空间复杂度与数字的二进制大小成正比。 时间复杂度 位翻转(辅助函数) **辅助函数**使用按位 XOR 运算对 X 和 Y 的位级别进行操作,从而找到位不同的位置。循环遍历每个位(数字中的 32 位),使时间复杂度为 O(32) = 或更简单地说,O(1),因为处理的位数是不变的。在 findOriginalNumber 函数的情况下,在集合 A 和 B 中找到共同位置。 由于位迭代的固定次数,时间复杂度再次为 O(32) 或 O(1)。 总体时间复杂度 单独考虑每个步骤,整体时间复杂度由恒定数量的位 (32) 主导。因此,时间复杂度可以写为 O(1)。 空间复杂度 辅助函数将变量 (flippedPositions) 存储为一个集合,其中位被翻转。此集合所需的空间与翻转位置的数量成正比,最多为 K,即总位数。因此,空间复杂度为 O(32) 或 O(1)。 findOriginalNumbers 函数使用一个集合 (commonPositions) 来存储集合 A 和 B 的共同位置。此外,所需的内存空间与出现频率间接成比例,同样小于或等于 32。因此,时间复杂度为 O(32) 或 O(1)。 总体空间复杂度 整体空间复杂度由 **flippedPositions** 和 **commonPositions** 所需的最大存储空间给出,即 O(32) 或 O(1)。 下一主题C++ 中的 fma() 函数 |
在 C++ 中,有大量的预构建函数和库可用于处理字符串。Strpbrk() 是一个不太为人所知但非常有用的例程。该函数是 <cstring> 头文件的一部分,属于 C 标准库。它的主要目的是...
阅读 4 分钟
密码验证是网络安全的一个基本方面,但经常被忽视。密码是防止未经授权访问帐户或系统的第一道防线,确保其强度可以抵御多种网络攻击。在本文中,我们将探讨和...
5 分钟阅读
在 C++ 中,面向对象编程 (OOP) 是一种使用类和对象来构造代码的计算机编程模型。它促进了模块化、可重用性和可伸缩性。C++ 是最广泛使用的 OOP 语言之一,并支持一些 OOP 概念,例如...
7 分钟阅读
C++ 中 new 和 delete 运算符的区别 在 C++ 编程语言中,new 和 delete 运算符主要用于动态内存分配和去分配。它们使我们能够动态地分配和释放内存,这意味着我们可以创建大小的... 对象
阅读 6 分钟
这个百货商店管理系统完全基于提供有关添加、计算和检查产品以及其他功能的信息。管理员或客户可以毫无压力地了解数据。该系统能够减少付款...
阅读 6 分钟
? 在编程领域,经常会出现解决复杂问题的创新解决方案。Duff's Device 是这种发明的绝佳例子,特别是在 C 和 C++ 编程语言中高效循环的领域。这个技术以其作者 Tom Duff 的名字命名,展示了一种...
阅读 4 分钟
在本文中,我们将讨论 C++ 中用于计算 LCM 的内置函数及其语法和方法。在编程时,我们经常需要确定两个数之间的最小公倍数(LCM)。我们可以直接使用 C++ boost 的内置函数 boost::math::lcm()...
阅读 3 分钟
在本文中,我们将讨论 C++ 中的线程安全队列及其示例。什么是线程安全队列?线程安全队列是一种数据结构,旨在确保并发环境下的线程安全。这种数据结构允许多个...同时入队和出队元素。
阅读 4 分钟
foreach 循环用于快速迭代容器(数组、向量等)的元素,而无需进行初始化、测试或增量/减量。Foreach 循环通过对每个元素执行某项操作而不是执行 n 次操作来工作。尽管 C++ 中没有 foreach 循环,但...
阅读 4 分钟
在本文中,我们将讨论 C++ 中的 munmap_chunk 无效指针及其语法、程序和几种方法。当已更改或失效的指针提供给 free() 时,会出现一个称为 munmap_chunk():不正确指针的问题。应该注意的是,该指针...
5 分钟阅读
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India