首页 文章资讯内容详情

使用 C++ 的至少一个非空子数组的按位 AND 的数字

2026-06-02 4 花语

为了解决给定数组的问题,我们需要找到所有可能的整数,这些整数是至少一个非空子数组的按位与,例如-

Input : nums[ ] = { 3, 5, 1, 2, 8 } Output : { 2, 5, 0, 3, 8, 1 } Explanation: 2 is the bitwise AND of subarray {2}, 5 is the bitwise AND of subarray {5}, 0 is the bitwise AND of subarray {1, 2}, {2, 8} and {1, 2, 8}, 3 is the bitwise AND of subarray {3}, 8 is the bitwise AND of subarray {8}, 1 is the bitwise AND of subarray {1}, {3, 5} and {3, 5, 1}. Input : nums[ ] = { 2, 6, 3, 8, 1 } Output: { 1, 8, 3, 6, 2, 0 }

寻找解决方案的方法

一个可以应用的简单方法是,

找出所有可能的非空子数组。

在遍历数组时,计算子数组中每个元素的按位与。

为避免重复值,请将所有结果存储在一个集合中。

示例

#include <bits/stdc++.h> using namespace std; int main(){ int arr[] ={ 2, 6, 3, 8, 1 }; int n = sizeof(arr) / sizeof(arr[0]); //声明set来存储每个AND运算的结果。 unordered_set<int> result; int val; //嵌套循环遍历所有可能的非空子数组。 for (int i = 0; i < n; ++i){ for (int j = i, val = INT_MAX; j < n; ++j){ val = val & arr[j]; //存储AND运算的结果 result.insert(val); } } cout << "所有可能的数字是: "; //打印set的所有值。 for (auto i = result.begin(); i != result.end();i++) cout << *i << " "; return 0; }输出结果所有可能的数字是: 1 8 3 6 0 2

以上代码说明

声明set来存储AND运算的所有结果。

使用INT_MAX初始化val变量,因为我们需要在所有位设置为1的情况下进行AND运算。

内部循环从第i个索引遍历所有可能的子数组。

计算每个元素与彼此和与自身的AND运算并存储在结果集中。

打印结果集的所有值。

结论

在本教程中,我们讨论了解决此问题的一种简单方法,即在每个可能的子数组中计算AND运算。我们还讨论了C++程序来解决这个问题。此外,您可以使用任何其他语言(如Java、C、Python等)编写此代码。我们希望本教程对您有所帮助。