在C ++中按位加三并等于零

假设我们有一个整数A的数组。我们必须找到索引(i,j,k)的三元组数,使得-

  • 0 <= i <A的大小

  • 0 <= j <A的大小

  • 0 <= k <A的大小

A [i] AND A [j] AND A [k]为0,其中AND表示按位与运算符。

因此,如果输入类似于[3,1,2],则输出将为12

  • 为了解决这个问题,我们将遵循以下步骤-

  • 定义一张映射

  • ret:= 0

  • n:= A的大小

  • 对于初始化i:= 0,当i <n时,更新(将i增加1),执行-

    • 对于初始化j:= 0,当j <n时,更新(将j增加1),执行-

    • 对于初始化j:= 0,当j <n时,更新(将j增加1),执行-

    • 对于初始化i:= 0,当i <n时,更新(将i增加1),执行-

      • 如果(a.key AND x)等于0,则-

      • ret:= ret +值

      • x:= A [i]

      • 对于m中的所有键值对a

      • 返回ret

      让我们看下面的实现以更好地理解-

      示例

      #include <bits/stdc++.h>
      using namespace std;
      class Solution {
         public:
         int countTriplets(vector<int>& A){
            unordered_map<int, int> m;
            int ret = 0;
            int n = A.size();
            for (int i = 0; i < n; i++) {
               for (int j = 0; j < n; j++) {
                  m[A[i] & A[j]]++;
               }
            }
            for (int i = 0; i < n; i++) {
               int x = A[i];
               for (auto& a : m) {
                  if ((a.first & x) == 0) {
                     ret += a.second;
                  }
               }
            }
            return ret;
         }
      };
      main(){
         Solution ob;
         vector<int> v = {3,1,2};
         cout << (ob.countTriplets(v));
      }

      输入值

      {3,1,2}

      输出结果

      12