C++でのサブ配列のビットごとのOR
非負の整数の配列Aがあるとします。 B =[A [i]、A [i + 1]、...、A [j]](i <=j)と言うすべての(連続する)サブ配列に対して、すべての要素のビットごとのORを実行します。 B、結果の取得A [i] | A [i + 1] | ... | A[j]。可能な結果の数を見つける必要があります。 (複数回発生した結果は、最終回答で1回だけカウントされます。)
したがって、入力が[1,1,2]の場合、サブ配列は[1]、[1]、[2]、[1,1]、[1,2]、[1]であるため、結果は3になります。 1,2]の場合、結果は1,1,2,1,3,3になり、3つの異なる結果が得られます。
これを解決するには、次の手順に従います-
-
retとcurr2の2つのセットを作成します
-
0から配列のサイズまでの範囲のiの場合
-
セットcurr1を作成し、それにA[i]を挿入します
-
curr2の各要素eについて-
-
curr1に(e OR A [i])を挿入します
-
-
各要素についてecurr1
-
retにeを挿入
-
-
curr2:=curr1
-
-
retの戻りサイズ
例
理解を深めるために、次の実装を見てみましょう-
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int subarrayBitwiseORs(vector<int>& A) {
unordered_set <int> ret;
unordered_set <int> curr2;
for(int i = 0; i < A.size(); i++){
unordered_set <int> curr1;
curr1.insert(A[i]);
unordered_set<int>::iterator it = curr2.begin();
while(it != curr2.end()){
curr1.insert(*it | A[i]);
it++;
}
it = curr1.begin();
while(it != curr1.end()){
ret.insert(*it);
it++;
}
curr2 = curr1;
}
return ret.size();
}
};
main(){
vector<int> v = {1,1,2};
Solution ob;
cout << (ob.subarrayBitwiseORs(v));
} 入力
[1,1,2]
出力
3
-
C ++のビットごとのORとは何ですか?
ビットごとのOR演算子(|)は、第1オペランドの各ビットを第2オペランドの対応するビットと比較します。いずれかのビットが1の場合、対応する結果ビットは1に設定されます。それ以外の場合、対応する結果ビットは0に設定されます。ビット単位の包括的OR演算子の両方のオペランドは、整数型である必要があります。たとえば、 例 #include <iostream> using namespace std; int main() { unsigned short a = 0x5555; /
-
C++のビット演算子
c++では3つのビット単位の演算子を使用できます。これらは、ビット単位のAND(&)、ビット単位のOR(|)、およびビット単位のXOR(^)です。 ビットごとのAND演算子(&)は、第1オペランドの各ビットを第2オペランドの対応するビットと比較します。両方のビットが1の場合、対応する結果ビットは1に設定されます。それ以外の場合、対応する結果ビットは0に設定されます。ビット単位の包括的AND演算子の両方のオペランドは、整数型である必要があります。たとえば、 例 #include <iostream> using namespace std; int mai