C++ 中范围内所有子数组按位与和的查询2024年8月29日 | 阅读 10 分钟 引言在本文中,任务是计算给定数组索引范围内所有子数组的按位与(bitwise AND)运算结果之和。按位与是一种运算,它将两个二进制数进行逻辑与运算,对每一对对应的位进行操作,生成一个新的二进制数。 程序输出 Sum of bitwise AND of all subarrays in the range [0, 2] is: 0 说明
此代码的主要目标是查找数组中给定范围内所有子数组的按位与运算结果之和。
此函数接受三个参数:**数组 (arr)**、**数组的大小 (n)** 以及由索引指定的范围 **(left 和 right)**。 它使用循环遍历每个 **位位置(0 到 31)**,因为整数通常用 32 位表示。
在循环内部,它计算当前位置的位在指定范围内(从 left 到 right)的数组元素中被设置为 1 的次数。
如果当前位置的设置位数等于范围内的元素数量,则意味着该位在范围内的所有子数组的 AND 运算结果都将始终为 1。因此,它将在结果中设置相应的位。
最终结果是通过组合所有位的按位或(bitwise OR)来累加的。
main 函数演示了 sumBitwiseAndInRange 函数的用法,使用了一个示例数组 ({5, 2, 8}) 和指定的范围(left = 0, right = 2)。 它打印出指定范围内所有子数组的按位与计算总和。 复杂度分析 时间复杂度
空间复杂度
方法 1:观察规律这种方法背后的思想是观察一系列连续数字的按位与运算,并认识到结果是它们二进制表示的公共前缀。之后,我们可以找到这个公共前缀并将其转换回十进制以获得最终结果。 程序输出 Sum of bitwise AND of all subarrays in the range [5, 8] is: 0 说明 findCommonPrefix 函数接受两个 **整数 (x 和 y)**,并查找它们二进制表示的公共前缀。它通过右移两个数字直到它们在当前位置的位不同来实现。然后,它将公共前缀移回其原始位置。 sumBitwiseAndInRange 函数调用 findCommonPrefix 来获取给定 **范围(left 到 right)** 的二进制表示的公共前缀。 main 函数演示了 sumBitwiseAndInRange 的用法,使用了一个示例 **范围(left = 5, right = 8)**。它计算并打印指定范围的按位与和。 复杂度分析 时间复杂度
空间复杂度
方法 2:使用位操作这种方法背后的思想是对指定范围内的所有元素执行 **按位与** 运算,并跟踪每个位位置的结果。 程序输出 Sum of bitwise AND of all subarrays in the range [5, 8] is: 0 说明
复杂度分析 时间复杂度 sumBitwiseAndInRange 函数的时间复杂度主要由迭代每个位位置的循环决定。该循环运行的常数次迭代(在本例中为 32 次),使时间 **复杂度为 O(1)**。 空间复杂度 代码的空间复杂度非常低且是常数。该算法只使用几个整数变量 **(result, left, right, bites)**,这些变量占用的空间不取决于输入大小。 此代码的总时间和空间复杂度为 **O(1)** 或常数。 方法 3:使用按位移位它有助于识别 left 和 right 的公共 **最左位**。将公共最左位右边的所有位设置为 0。 程序输出 Sum of bitwise AND of all subarrays in the range [5, 8] is: 0 说明
该函数接受两个整数 **left** 和 **right**,表示范围。 它初始化一个变量 shift 为 0,该变量将跟踪需要移位的位数。 while 循环持续进行,直到 left 和 right 相等。 在每次迭代中,left 和 right 都向右移位 1,并且 shift 递增。 循环结束后,它将 left 或 right 向左移位 shift 次,以恢复公共最左位。 返回最终结果。
main 函数演示了 sumBitwiseAndInRange 的用法,使用了一个示例范围 **(left = 5, right = 8)**。 它计算并打印指定范围的 **按位与** 和。 复杂度分析 时间复杂度 sumBitwiseAndInRange 函数的时间复杂度主要由 while 循环决定。该循环一直运行到 left 和 right 相等,在最坏情况下需要对数时间。 时间复杂度为 **O(log(min(left, right)))**。 空间复杂度 空间复杂度非常 **低** 且 **恒定**。该算法只使用几个整数变量 **(left, right, shift)**,这些变量占用的空间不取决于输入大小。 空间复杂度为 **O(1)** 或常数。 方法 4:使用公共前缀位掩码它识别 **left 和 right** 的公共 **最左位**。 将公共最左位右边的所有位设置为 0。 使用 **位掩码** 保留公共 **最左位**。 程序输出 Sum of bitwise AND of all subarrays in the range [5, 8] is: 0 说明 函数 sumBitwiseAndInRange
主函数
复杂度分析 时间复杂度
空间复杂度
|
目标是通过添加尽可能多的边将一个 N 节点树转换为二分图。请记住,不允许自环和多重边,但允许环。图示:解释:可以添加连接节点 3 和 4 的边以保持图是二分的。可以...
阅读 3 分钟
函数重载和函数覆盖在面向对象编程 (OOPs) 中对于实现代码重用和灵活性至关重要。尽管它们听起来可能很相似,但这两个概念在根本上是不同的。本博客的目标是让读者全面了解 C++...
阅读 6 分钟
C++ 是一种类似的编程语言,它结合了 C 编程语言和 Simula67 的特性(Simula67 被认为是第一门面向对象的语言)。C++ 建立了类和对象的概念。您是否正在寻找一本入门好书...
阅读 6 分钟
?本节将讨论 C++ 编程语言中两个或多个字符串的连接。字符串的连接意味着将两个或多个字符串组合起来,返回一个连接后的单个字符串。在连接字符串时,第二个字符串被添加到…
5 分钟阅读
std::adjacent_difference 是 C++ 中的一个函数,它计算序列中相邻元素之间的差值,并将结果存储在另一个序列中。它是标准模板库 (STL) 的一部分,在分析值从一个元素到另一个元素的_变化_时特别有用。
阅读9分钟
C++ 智能指针 std::observer_ptr 被包含在 C++ 标准库中,并于 C++20 首次亮相。它旨在作为对某个对象的轻量级、非拥有引用。std::observer_ptr 用于表示某段代码在不承担任何...
阅读 3 分钟
单向链表 forward_list 具有一组独特的成员函数。Reverse() 是其中一个非常有用的函数,可用于重新排列列表中的元素。在本帖中,我们将深入探讨 forward_list::reverse() 的语法、用法和潜在优势...
阅读 4 分钟
本节将讨论 C++ 编程语言中的 const 关键字。const 关键字用于定义在程序执行期间不能更改的常量值。这意味着一旦我们在程序中将变量声明为常量,该变量的值将...
7 分钟阅读
在本文中,您将了解其语法和示例。unordered_multimap key_eq 函数是什么?在 C++ 语言中,unordered_multimap 是一种容器,允许具有相同键的多个元素。在此函数中,允许重复键。key_eq 成员函数是...
阅读 3 分钟
在本文中,我们将讨论 C++ 程序,以演示格式标志在浮点输出中的使用。可以使用 ios_base 头文件中包含的格式标志来格式化浮点输出。浮点数的输出格式可以设置为...
阅读 3 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India