输入的第一串字母,存在一位错误。
输入的第二串字母,存在一位错误。
答案保证唯一解
我们需要去枚举每一位,找到二进制和三进制下转为十进制的数的交集。
看到这里如果直接暴力枚举,时间是10的9次方乘上log10的9次方
大于10的8次方
,必然超时。
所以需要改变枚举的方式,由于a、b
均存在一位错误,我们就枚举a
的每一位的不同数,把他加到set
中,再在枚举b
时侯,与set
进行一个判断,判断在set
中是否存在这个a
转换的十进制数,存在则说明成立,输出转为10进制的数字即可。
我们在读入字符串的时候,字符数组存的是顺序存储,而在日常计算进制转换的时候是逆序计算。
所以我们通过移位的操作去计算字符数组中的进制转换数,如下图所示:
import java.util.*;
public class Main{
public static int get(char []a,int b){
int res=0;
for(int i=0;i<a.length;i++){
res=res*b+(a[i]-'0');//将n进制的数字转换为十进制的数
}
return res;
}
public static void main(String []args){
Set <Integer> set = new HashSet<>();//存储a数组的元素
Scanner in = new Scanner(System.in);
String s1=in.next();
String s2=in.next();
char []a=s1.toCharArray();
char []b=s2.toCharArray();
for(int i=0;i<a.length;i++){
a[i]^=1;//将0变成1,将0变成1
set.add(get(a,2));//将二进制的数转换为十进制的数
a[i]^=1;
//只需将枚举的字母变化即可,再将本位的数进行还原,不去影响后面的运算结果。
}
for(int i=0;i<b.length;i++){
char t=b[i];
//先用字符变量存储枚举的字母
//这么做的目的是便于后面字符的还原。
for(char j='0';j<='2';j++){
if(t!=j){
b[i]=j;
//将枚举的字母进行处理
int x=get(b,3);//三进制的数字转换为十进制的数字
if(set.contains(x)){
System.out.println(x);
return;//保证唯一解
}
}
}
b[i]=t;//还原字符
}
}
}