在 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 函数

**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)。