本题算法思想 用异或^ 异或的本质就是 二进制位相同的为0 不相同则为1
首先我们需要知道 0^1==1 0^2==2 即是0异或所有数还是等于那个数本身
其次 两个相同的数进行异或时结果为0
1.创立一个主函数
public static void main(String[] args){
int[] array={1,2,3,3,2,4};
int len= array.length;
int[] ret=find(array);
System.out.println(ret);
}
2.实现find函数 find方法可以协助找到那两个只出现一次的数字
先把所有数字进行异或处理 得到一个结果 这个结果为数组数字中两个不相同的数字的异或结果
解题思路已在代码中注释 自见
public static int[] find(int[] array){
//当少于两个或为空时 返回null
if(array==null||array.length<2){
return null;
}
int result=0;
//把数组中每一个元素进行异或
for(int i=0;i<array.length;i++){
result^=array[i];
}
//思想思路:
//1.把异或结果从右往左找看第一个1是哪一位 再把数组中每个元素数字这一位也为1的分为一组
// 其余则分为第二组
//2.再把这两组分别进行异或 得到的两个数字结果即是我们所找结果
//并且把从右向左第一次遇到1的这一位记下来设为indexof1 我们创立一个函数实现
int indexof1=findleomessi(result);
//进行分组 遍历数组 把数字分为两组 然后分组进行异或 得到结果即是两个数字
int num1=0;
int num2=0;
for(int i=0;i<array.length;i++){
//if语句判断是布尔类型 因此我们创立方法时也得是布尔类型
if(isleo(array[i],indexof1)){
num1^=array[i];
} else {
num2^=array[i];
}
}
System.out.println(num1+" "+num2);
}
3.实现findleomessi方法 来确定从右向左第一个为1时的下标
//把异或结果从右往左找看第一个1是哪一位 实现方法
public static int findleomessi(int result){
int indexBit=0;
while((result&1)==0&&indexBit<8*Integer.SIZE){
result=result>>1;//每一次向右一位
++indexBit;
}
return indexBit;
}
4.实现 isleo方法 目的1是进行分组 注意是布尔类型
//实现isleo方法 有一个目的就是把它进行分组
//if语句判断是布尔类型 因此我们创立方法时也得是布尔类型
public static boolean isleo(int n,int indexof1){
n=n>>indexof1;//右移indexof1位
return (n&1)==1?true:false;//判断这一位是否与其遇到的第一位1所在位相同?
}
全部代码如下
public class Eriksen24 {
public static int[] find(int[] array){
//当少于两个或为空时 返回null
if(array==null||array.length<2){
return null;
}
int result=0;
//把数组中每一个元素进行异或
for(int i=0;i<array.length;i++){
result^=array[i];
}
//思想思路:
//1.把异或结果从右往左找看第一个1是哪一位 再把数组中每个元素数字这一位也为1的分为一组
// 其余则分为第二组
//2.再把这两组分别进行异或 得到的两个数字结果即是我们所找结果
//并且把从右向左第一次遇到1的这一位记下来设为indexof1 我们创立一个函数实现
int indexof1=findleomessi(result);
//进行分组 遍历数组 把数字分为两组 然后分组进行异或 得到结果即是两个数字
int num1=0;
int num2=0;
for(int i=0;i<array.length;i++){
//if语句判断是布尔类型 因此我们创立方法时也得是布尔类型
if(isleo(array[i],indexof1)){
num1^=array[i];
} else {
num2^=array[i];
}
}
System.out.println(num1+" "+num2);
}
//把异或结果从右往左找看第一个1是哪一位 实现方法
public static int findleomessi(int result){
int indexBit=0;
while((result&1)==0&&indexBit<8*Integer.SIZE){
result=result>>1;//每一次向右一位
++indexBit;
}
return indexBit;
}
//实现isleo方法 有一个目的就是把它进行分组
//if语句判断是布尔类型 因此我们创立方法时也得是布尔类型
public static boolean isleo(int n,int indexof1){
n=n>>indexof1;//右移indexof1位
return (n&1)==1?true:false;//判断这一位是否与其遇到的第一位1所在位相同?
}
public static void main(String[] args){
int[] array={1,2,3,3,2,4};
int len= array.length;
int[] ret=find(array);
System.out.println(ret);
}
}