トピック1の説明:
アイデア:XORソリューションの使用
コードデザイン:
package T;
import java.util.Random;
public class Main {
public static void main(String[] args) {
int []array=new int[12];//简化版 方便寻找
for(int i=1;i<=10;i++)
array[i]=i;
array[11]=new Random().nextInt(11)+1;
for(int i=1;i<=11;i++)
System.out.print(array[i]+" ");
System.out.println();
int x=0;
for(int i=1;i<=10;i++)
x=x^i;//异或操作 生成 1-10
for(int i=1;i<=11;i++)
x=x^array[i];//再次异或 得出重复的那个数
System.out.println(x);
}
}
トピック2の説明:
アイデア:
この問題は前の問題よりも単純です。直接XORによって繰り返し数を取得でき、スペースの複雑さはO(1)です。
コードデザイン:
package T;
public class Main {
public static void main(String[] args) {
int []array={
1,1,2,2,3,4,5,6,4,5,6};
int l=array.length;
int x=0;
for(int i=0;i<l;i++)
x=x^array[i];//直接异或
System.out.println(x);
}
}
トピック3の説明:
コード1の設計:
package T;
public class Main {
public static void main(String[] args) {
int n=8;
int count=0;
while (n!=0){
count+=n&1;
n>>>=1;
}
System.out.println(count);
}
}
コード2の設計:
package T;
public class Main {
public static void main(String[] args) {
int n=8;
int count=0;
while (n!=0){
n=n&(n-1);//消除低位1 1000 消一次
count++;//总共多少次与操作 就代表多少个1
}
System.out.println(count);
}
}
トピック4の説明:
コード設計:
package T;
public class Main {
public static void main(String[] args) {
int n=10;
if((n&(n-1))==0)
System.out.println("Yes");//一个1
else System.out.println("No");
}
}
トピック5説明:整数の奇数ビットと偶数ビットを交換します。
アイデア:偶数桁を保持するためにaでAND演算を実行し、
c
を取得し、bでAND演算を実行し、奇数桁を保持し、
cでdを取得します。1ビットをシフトします。右に、dを1ビット左にシフトし、XOR演算を実行して、整数のパリティビットを交換した結果を取得します。
コードデザイン:
package T;
public class Main {
public static void main(String[] args) {
int n=9;
int a=n&0xaaaaaaaa;//从左数 得到偶数位 int型 32位表示 二进制表示0b10101010_10101010_10101010_10101010
int b=n&0x55555555;//从左数 得到奇数位
int result=(a>>1)^(b<<1);//偶数左移一位 奇数右移一位
System.out.println(result);//result=6
}
}