《蓝桥杯每日一题》哈希·AcWing 2058. 笨拙的手指

简介: 《蓝桥杯每日一题》哈希·AcWing 2058. 笨拙的手指

1.题目描述


每当贝茜将数字转换为一个新的进制并写下结果时,她总是将其中的某一位数字写错。

例如,如果她将数字 14 转换为二进制数,那么正确的结果应为 1110,但她可能会写下 0110 或 1111。


贝茜不会额外添加或删除数字,但是可能会由于写错数字的原因,写下包含前导 0 的数字。

给定贝茜将数字 N 转换为二进制数字以及三进制数字的结果,请确定 N 的正确初始值(十进制表示)。


输入格式


第一行包含 N 的二进制表示,其中一位是错误的。

第二行包含 N 的三进制表示,其中一位是错误的。


输出格式


输出正确的 N 的值。


数据范围


N 一定不超过 109,且存在唯一解。


输入样例

1010212

输出样例

14

2.思路分析


有一个十分简单的思路,把二进制数,所有可能的数都计算出来,存下来。


再把三进制所以可能的数计算出来,存下来。


两者的交集,所共同拥有的数字,一定是正确答案。


首先,需要枚举,改变二进制每一位对应的数,直接异或取反即可,


然后将异或后的结果根据秦九韶算法转换成10进制数并保存到哈希数组中,


最后改变三进制每一位对应的数,转成10进制后判断其是否在哈希数组中存在


3.秦九韶算法


秦九绍算法是非常高效的转换为十进制数的算法,因为他可以计算多项式,我们便把他用于了其它进制向十进制的转换中,


4.Ac代码


import java.io.*;
import java.util.HashSet;
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader  br=new BufferedReader(new InputStreamReader(System.in));
        String s1=br.readLine();
        String s2=br.readLine();
        //转换成字符数组,字符串无法异或
        char []c1=s1.toCharArray();
        char []c2=s2.toCharArray();
        HashSet<Integer> hs=new HashSet<>();
        for (int i = 0; i < c1.length; i++) {
            //将每位数字异或取相反数字
            c1[i]^=1;
            //转换为10进制数后添加到哈希表中
            hs.add( change(c1,2));
            //然后转换回来,方便下一位转换
            c1[i]^=1;
        }
        for (int i = 0; i < c2.length; i++) {
            char t=c2[i];
            for(char j='0';j<'3';j++){
                //如果c本位等于当前的值则跳过继续,因为必定会错一位
                if(c2[i]==j)  continue;
                //如果不是则赋j值
                c2[i]=j;
                if(hs.contains(change(c2,3))){
                    System.out.println(change(c2,3));
                    return;
                }
                c2[i]=t;
            }
        }
    }
    //根据秦九韶算法将其他进制转换为10进制数
    private static Integer change(char c[], int t) {
        int re=0;
        for (int i = 0; i < c.length; i++) {
            re=re*t+c[i]-'0';
        }
        return re;
    }
}


感谢你能看完, 如有错误欢迎评论指正,有好的思路可以交流一波,如果对你有帮助的话,点个赞支持下

相关文章
|
存储 算法 索引
蓝桥杯丨哈希算法
蓝桥杯丨哈希算法
59 0
|
算法
《蓝桥杯每日一题》KMP算法·AcWing 141. 周期
《蓝桥杯每日一题》KMP算法·AcWing 141. 周期
119 0
《蓝桥杯每日一题》递归·AcWing 1497. 树的遍历
《蓝桥杯每日一题》递归·AcWing 1497. 树的遍历
60 0
《蓝桥杯每日一题》递推·AcWing 3777. 砖块
《蓝桥杯每日一题》递推·AcWing 3777. 砖块
79 0
《蓝桥杯每日一题》双指针·AcWing 3768. 字符串删减
《蓝桥杯每日一题》双指针·AcWing 3768. 字符串删减
62 0
|
算法
《蓝桥杯每日一题》二分·AcWing 1460. 我在哪?
《蓝桥杯每日一题》二分·AcWing 1460. 我在哪?
54 0
|
人工智能
《蓝桥杯每日一题》 前缀和·Acwing 3956. 截断数组
《蓝桥杯每日一题》 前缀和·Acwing 3956. 截断数组
68 0
|
算法
【AcWing刷题】蓝桥杯专题突破-动态规划-dp入门(17)
【AcWing刷题】蓝桥杯专题突破-动态规划-dp入门(17)
116 0
|
算法
【AcWing刷题】蓝桥杯专题突破-广度优先搜索-bfs(11
【AcWing刷题】蓝桥杯专题突破-广度优先搜索-bfs(11
97 0
|
6月前
|
人工智能 算法 Java
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1005 数字游戏
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1005 数字游戏
107 0