C++での総ハミング距離
番号のリストがあるとします。与えられた数のすべてのペアのハミング距離を見つける必要があります。 2つの整数間のハミング距離は、対応するビットが異なる位置の数であることがわかっています。
したがって、入力が[4,14,17,2]の場合、出力は17になります。
これを解決するには、次の手順に従います-
-
m:=1 ^ 9 + 7
-
関数add()を定義します。これには、a、b、
が必要です。 -
return((a mod m)+(b mod m))
-
関数mul()を定義します。これにはa、b、
が必要です。 -
return((a mod m)*(b mod m))
-
関数cntBits()を定義します。これは、配列a、
を取ります。 -
サイズ32x2の2D配列ビットを1つ定義します
-
ans:=0、n:=aのサイズ
-
初期化i:=0の場合、i
-
x:=a [i]
-
初期化j:=0の場合、j <32の場合、更新(jを1増やします)、実行-
-
b:=(x / 2 ^ j)AND 1
-
ans:=add(ans、mul(1、bits [j、inverse of b]))
-
ビット[j、b]:=add(bits [j、b]、1)
-
-
-
ansを返す
-
メインの方法から、次のようにします-
-
cntBits(nums)を返す
理解を深めるために、次の実装を見てみましょう-
例
#include <bits/stdc++.h>
using namespace std;
typedef long long int lli;
const int m = 1e9 + 7;
class Solution {
public:
lli add(lli a, lli b){
return ((a % m) + (b % m));
}
lli mul(lli a, lli b){
return ((a % m) * (b % m));
}
int cntBits(vector<int>& a){
vector<vector<lli> > bits(32, vector<lli>(2));
lli ans = 0;
int n = a.size();
for (int i = 0; i < n; i++) {
lli x = a[i];
for (lli j = 0; j < 32; j++) {
lli b = (x >> j) & 1;
ans = add(ans, mul((lli)1, bits[j][!b]));
bits[j][b] = add(bits[j][b], (lli)1);
}
}
return ans;
}
int totalHammingDistance(vector<int>& nums){
return cntBits(nums);
}
};
main(){
Solution ob;
vector<int> v = {4,14,17,2};
cout << (ob.totalHammingDistance(v));
} 入力
{4,14,17,2} 出力
17
-
最初のN個の数値を再配置して、C++でKの距離に配置します
整数変数、たとえばNとKが与えられます。タスクは、最初にNの順列を計算し、次にすべての要素からKの距離になるように順列を再配置することです。 このためのさまざまな入出力シナリオを見てみましょう- 入力 − int n =20、int k =2 出力 −最初のN個の数字をK距離に並べ替えると、次のようになります。3 4 1 2 7 8 5 6 11 12 9 10 15 16 13 14 19 20 17 18. 説明 −整数変数「N」、つまり20と「K」、つまり2が与えられます。次に、「N」の順列、つまり1、2、3、4、5、6、7、8、9、10、11を計算します。 、12、13、14
-
C++でmが同一線上にある合計nポイントの三角形の数
2D平面上の点の数を表す2つの変数nとmが与えられます。 n個のポイントのうち、m個のポイントは同一線上にあります。目標は、これらのn個の点を使用して形成できる三角形の数を見つけることです。 同一線上の点 −同じ線上にある点は同一線上にあると呼ばれます。ポイントAとBは同一線上にあります。 n =4(A、B、C、D)の場合、m =2(A、B) 三角形の数- 4から任意の3つのポイントを選択=4C 3 ただし、同一線上の点は三角形を形成できないため、上記でカウントされる可能性のある三角形を削除します=2C 3 三角形の合計=4C 3 --2C 3 =4-0 =4