密码破译问题:地球和天女星座开战了,你是地球防卫军的密码破解员,以下你是破解出来的部分密码 tyt:好 huy:这 bvn:天 jkl :是 lgc:你 qqq:哈

tyt:好    huy:这    bvn:天   jkl :是  lgc:你  qqq:哈    dz:才    aer:人   zse:个    uef:真    out:妙   ygh:小

内容:qfhiqcgyqlhuaghfdkucuvnjdkefjiuiukaaaclzseybhfgwefhbccvnfffdz

问题分析:也就是在上面这段乱七八糟好的内容里面,先找到t,h,b,j,l,q,d,a,z,u,o,y开头的字母,再匹配后面两个字母看有没有这两个字母。有就输入这个汉字,没有就继续循环。当然这个问题是修改过的,首字母都不一样。比较简单。如果再加几个首字母和这个相同的汉字,那就算是一个最基本的公司面试java工程师的题了。

第一步:建立一个密码类,返回值为上面的密文和那一段内容遍历的明文。

public class PwdExcel {

    public String miwen;

    public String mingwen;

    public PwdExcel(String miwen, String mingwen) {

        this.mingwen = mingwen;
        this.miwen = miwen;
    }
}


第二步:建立密码破译类,这个类实现对内容的遍历,再和明文的首字母对比。内层循环再寻找后面对应的字母。有就输出这个汉字

方法1

public class Decode {

    private PwdExcel[] mimaben = { new PwdExcel("tyt", "好"), new PwdExcel("huy", "这"), new PwdExcel("bvn", "天"),
            new PwdExcel("jkl", "是"), new PwdExcel("lgc", "你"), new PwdExcel("qqq", "哈"), new PwdExcel("dz", "才"),
            new PwdExcel("aer", "人"), new PwdExcel("zse", "个"), new PwdExcel("uef", "真"), new PwdExcel("out", "妙"),
            new PwdExcel("ygh", "小"), };

    public void decode(String mima) {


        int i = 0;
        // 遍历传入的密码
        while (i < mima.length()) {
            // 遍历密码表
            boolean flag = false;
            for (int j = 0; j < mimaben.length; j++) {
                if (mima.charAt(i) == mimaben[j].miwen.charAt(0)) {
                    flag = true;
                    System.out.print(mimaben[j].mingwen);
                    // 遍历密码表里面的密文
                    String mi = mimaben[j].miwen;
                    for (int m = 0; m < mi.length(); m++) {
                        //这里只设置光标到哪里了
                        i = mima.indexOf(mi.charAt(m),i);
                        i++;
                    }
                    break;
                }
            }
            if(flag == false){
                i++;
            }
        }

    }

方法2.递归实现

public void decodeI(String mima){

        
        //通过递归实现求密码的
        //首先每次输入的密码我们认为是一个新的密文,如果这个密文长度变成0,那么我就可以退出这个递归方法了
        //方法递归时,每次我们都用上一次查询完成新的字符串,进行新的查询过程
        
        boolean flag = false;
        for(int i = 0; i < mimaben.length;i++){
            //如果输入密码的首字母和某个循环的过程中,密码的密文首字母一致,则认为找到了这个文字
            if(mima.length()==0){
                return;
            }
            
            if(mima.charAt(0) ==mimaben[i].miwen.charAt(0)){
                flag = true;
                System.out.println(mimaben[i].mingwen);
                //获取这个密码本的密文
                String temp = mimaben[i].miwen;
                //使用这个密文尝试截断字符串
                for(int j=0;j<temp.length();j++){
                    int jiedian = mima.indexOf(temp.charAt(j));
                    mima = mima.substring(jiedian, mima.length());
                }
            }
        }
        if(!flag){
            mima = mima.substring(0);
        }
        decodeI(mima);

3.创建test类,实现方法

public static void main(String[] args) {
        String mima = "qfhiqcgyqlhuaghfdkucuvnjdkefjiuiukaaaclzseybhfgwefhbccvnfffdz";
        
        Decode decode = new Decode();
        decode.decodeI(mima);

}

4.运行结果如下:

 
   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值