C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++でビット単位でゼロに等しいトリプル


整数Aの配列があるとします。-

となるようなインデックス(i、j、k)のトリプルの数を見つける必要があります。
  • 0 <=i

  • 0 <=j

  • 0 <=k

A [i] AND A [j] AND A [k]は0です。ここで、ANDはビット単位のAND演算子を表します。

したがって、入力が[3,1,2]の場合、出力は12

になります。
  • これを解決するには、次の手順に従います-

  • 1つのマップを定義するm

  • ret:=0

  • n:=Aのサイズ

  • 初期化i:=0の場合、i

    • 初期化j:=0の場合、j

      • 初期化j:=0の場合、j

  • 初期化i:=0の場合、i

    • x:=A [i]

    • m内のすべてのキーと値のペアa

      • (a.key AND x)が0と同じ場合、-

        • ret:=ret + a.value

  • 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

  1. N以下で、C++の合計がSである最小数

    問題の説明 1からNまでのN個の数とS個の数が与えられます。タスクは、合計してSを与える最小数の数を出力することです 例 n=7およびs=10の場合、最低2つの数字が必要です (9, 1) (8, 2) (7, 3) (6, 4) アルゴリズム Answer can be calculated using below formula (S/N) + 1 if { S %N > 0} 例 #include <bits/stdc++.h> using namespace std; int getMinNumbers(int n, int s) {    r

  2. C ++のビットごとのANDとは何ですか?

    ビットごとのAND演算子(&)は、第1オペランドの各ビットを第2オペランドの対応するビットと比較します。両方のビットが1の場合、対応する結果ビットは1に設定されます。それ以外の場合、対応する結果ビットは0に設定されます。ビット単位の包括的AND演算子の両方のオペランドは、整数型である必要があります。たとえば、 例 #include <iostream>   using namespace std;   int main() {      unsigned short a = 0x5555;