ビット演算における異或の応用
12101 ワード
この数日、异或に関するいくつかの问题型を见て、ついでに记录をまとめて、自分で后で复习を见ることができます.
一、何が異或なのか、どのようにもっとよく理解しますか?
javaでは、ビット演算子に異和の演算子があり、記号(^)で表され、その演算規則は、2つのバイナリオペランドの同じビットで、同じ場合は結果が0で、異なる場合は結果が1です.例を挙げます. 3^10対応するバイナリ=>0011^1010=1001; 2^3対応バイナリ=>10^11=01=1 異或の特徴法則:0は、1つの数と異なるか、またはそれ自体の を操作します.それ自体が自分と异なったり、体操をしたりして0 とします.異種または動作はまた、交換率 を満たす.
二、異或いは題型の運用
題目1:配列に一度しか現れない数字を探し出す
分析:例えば、2 n+1個の数があると仮定し、そのうち2 n個が同じであると仮定すると、異なる数、すなわち1回しか現れない数、例えば:1,2,3,2,1を見つける必要がある.異和演算子を使用すると、次のように書くことができます.
タイトル2:1-1000この1000個の数の中で1001個の要素を含む配列の中に置いて、唯一の1つの要素の値だけが繰り返して、その他はすべて1回しか現れません.各配列要素は一度しかアクセスできず、アルゴリズムを設計し、彼を探し出すことができます.補助空間を使わずにアルゴリズムを設計して実現できますか?
この問題は前の問題で使った知識点と同じですが、考え方が少し違います.前の問題は同じものを消して、残りは解を求める答えです.この問題は異なるものを消して、残りは同じものが解を求める答えで、私たちはこのように考えることができます:{1,2,3,k,・・・k・・1000}^{1,2,3,・・k・・・1000}このようにもう1組来て、異或を行って答えを出すことができます.
補足:補助空間を開いて問題を作る
一、何が異或なのか、どのようにもっとよく理解しますか?
javaでは、ビット演算子に異和の演算子があり、記号(^)で表され、その演算規則は、2つのバイナリオペランドの同じビットで、同じ場合は結果が0で、異なる場合は結果が1です.例を挙げます.
二、異或いは題型の運用
題目1:配列に一度しか現れない数字を探し出す
分析:例えば、2 n+1個の数があると仮定し、そのうち2 n個が同じであると仮定すると、異なる数、すなわち1回しか現れない数、例えば:1,2,3,2,1を見つける必要がある.異和演算子を使用すると、次のように書くことができます.
public static void main(String[] args){
int[] arr = {1,2,3,2,1};
int n = arr[0];
for(int i = 1;i<arr.length;i++){
n = n^arr[i];
}
System.out.println(n);
}
タイトル2:1-1000この1000個の数の中で1001個の要素を含む配列の中に置いて、唯一の1つの要素の値だけが繰り返して、その他はすべて1回しか現れません.各配列要素は一度しかアクセスできず、アルゴリズムを設計し、彼を探し出すことができます.補助空間を使わずにアルゴリズムを設計して実現できますか?
この問題は前の問題で使った知識点と同じですが、考え方が少し違います.前の問題は同じものを消して、残りは解を求める答えです.この問題は異なるものを消して、残りは同じものが解を求める答えで、私たちはこのように考えることができます:{1,2,3,k,・・・k・・1000}^{1,2,3,・・k・・・1000}このようにもう1組来て、異或を行って答えを出すことができます.
public static void main(String[] args) {
int N = 11;
int[] arr = new int[N];
for (int i=0;i<arr.length-1;i++){
arr[i] = i+1;
// System.out.print(arr[i]+"--");
}
// , :[1,N)
arr[arr.length-1] = new Random().nextInt(N-1)+1;
for (int value : arr) {
System.out.print(value + "--");
}
System.out.println();
int x1 = 0;
for (int i = 1;i <= N-1;i++) {
x1 = (x1^i);
System.out.print(x1+"--");
}
System.out.println("***"+x1);
for (int i = 0;i < N;i++) {
x1 = x1^arr[i];
}
System.out.println(" :"+x1);
}
}
補足:補助空間を開いて問題を作る
int[] helper = new int[N];
for (int i=0;i<N;i++) {
helper[arr[i]]++;
}
for (int i=0;i<N;i++) {
if(helper[i]==2){
System.out.println(" :"+i);
break;
}
}