题目1描述:
思路:采用异或解法
代码设计:
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描述:
思路:
这题比上题更简单,直接异或,就可得出重复的数,空间复杂度为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做与运算,保留偶数位,得到c
将某个数,与b做与运算,保留奇数位,得到d
在将c右移一位,d左移一位,在做异或操作,得到的就是整数的奇偶位互换的结果
代码设计:
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
}
}