练习1:
在一个数组中除了某个数字以外,其他数字都出现两次,找到这个数
思路:
可以用异或对出现两次的数字进行消除
代码
public class BitOperations3 {
public static void main(String[] args) {
int arr[]= {1,1,2,2,3,3,4,4,7,7,25,25,8,8,6};
int x1=0;
for(int i=0;i<arr.length;i++)
x1=x1^arr[i];
System.out.println(x1);
}}
# 练习2:
1~1000这1000个数放在含有1001个元素在数组中只有唯一一个元素重复,找到重复的数
## 思路 用1-1000对这个数组进行去重
## 代码
import java.util.Random;
public class BitOperations4 {
public static void main(String[] args) {
int n=1001;
int[] arr=new int[n];
for(int i=0;i<arr.length-1;i++)
arr[i]=i+1;
arr[n-1]=new Random().nextInt(n-1)+1;
int x1=0;
for(int i=1;i<n;i++)
x1=x1^i;
for(int i=0;i<arr.length;i++)
{
x1=x1^arr[i];
System.out.print(arr[i]+",");
}
System.out.println("\n"+arr[arr.length-1]);
System.out.println(x1);
}}
下面开始正题:
在一个数组中只有一个数出现了一次,其他数都出现K次,输出出现一次的数
## 思路
跟上面的思路一样进行去重,那怎么去重复呢
我们知道两个相同的二进制数进行不进位加法等于零,
十个十进制数进行不进位加法等于零,
那么k个k 进制进行不进位加法等于零
## 代码
public class BitOperations1 {
public static void main(String[] args) {
int k=3;
int arr[]= {1,1,1,7,7,7,6,8,8,8,0,0,0};
char[][] arrs=new char[arr.length][];
int maxlen=0;
for(int i=0;i<arr.length;i++)
{
arrs[i]=new StringBuilder(Integer.toString(arr[i],k)).reverse().toString().toCharArray();
if(arrs[i].length>maxlen)
maxlen=arrs[i].length;
}
int []resArr=new int[maxlen];
for(int i=0;i<arr.length;i++)
{
for(int j=0;j<maxlen;j++)
{
if(j>=arrs[i].length)
resArr[j]+=0;
else
resArr[j]+=(arrs[i][j]-'0');
}
}
int res=0;
for(int i=0;i<maxlen;i++)
{
res+=(resArr[i]%k)*(int)(Math.pow(k,i));
}
System.out.print(res);
}}
# <-_->
# -------------------------------------------------------------------------------------Zzh
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。