大家好 我是寸铁
如果你觉得这篇题解对你有用,可以动动手点个赞或关注,谢谢~
题目描述
输入的第一串字母,存在一位错误。
输入的第二串字母,存在一位错误。
答案保证唯一解
我们需要去枚举每一位,找到二进制和三进制下转为十进制的数的交集。
看到这里如果直接暴力枚举,时间是10的9次方乘上log10的9次方
大于10的8次方
,必然超时。
所以需要改变枚举的方式,由于a、b
均存在一位错误,我们就枚举a
的每一位的不同数,把他加到set
中,再在枚举b
时侯,与set
进行一个判断,判断在set
中是否存在这个a
转换的十进制数,存在则说明成立,输出转为10进制的数字即可。
进制转换
我们在读入字符串的时候,字符数组存的是顺序存储,而在日常计算进制转换的时候是逆序计算。
所以我们通过移位的操作去计算字符数组中的进制转换数,如下图所示:
Accode
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变成1set.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;//还原字符}
}
}