繁体   English   中英

用Java解密加密的文本

[英]Decrypt encrypted text in java

我有一个作业。 我已经完成了作业的所有部分。 但我对我的作业感到震惊。 你能帮助我吗

分配准则

III。为EncryptedNode类编写一个构造方法。 此构造函数应将String作为参数。 与您编写的其他构造函数不同,此构造函数应有条件地起作用。 如果消息是一个字符长,只需将该字符分配给字母实例变量。 如果消息长两个字符,则将第一个字符分配给字母,将另一个字符作为字符串分配给右侧的EncryptedNode。 在任何其他情况下,请找到输入字符串的中间值,并将第一个索引处的字符分配给字母,字符

从1到中间的字符应转到正确的EncryptedNode,其余未声明

字符应位于左侧的EncryptedNode。 注意:您将从此构造函数实例化新的EncryptedNode对象,从而创建递归构造。

IV。 编写以下方法:

一种。 解密方法不带任何参数,并返回一个字符串。 此方法应通过递归添加每个EncryptedNode的字母,左元素和右元素来重建原始的未加密String。 这个过程将留给您解决。

我的示例代码是

class EncryptedNode {

public EncryptedNode left, right ;
public char letter ;


// EncryptedNode Class constructor method.
public EncryptedNode (String message) {

    // get String length
    int message_length = message.length() ;

    if (message_length == 1) {
        this.letter = message.charAt(0) ;
    }else if (message_length == 2) {
        this.letter = message.charAt(0) ;
        this.right = new EncryptedNode (message.substring(1));
    } else {
        this.letter = message.charAt(0) ;

        // get the middle index of the message string.
        int middle_index = message.substring(1).length() /2 ;

        // get left and right strings
        String rightStr = message.substring(1,middle_index+1);
        String leftStr = message.substring(middle_index+1);

        this.left = new EncryptedNode (leftStr);
        this.right = new EncryptedNode (rightStr);
    }

    System.out.println (this.letter);
    // System.out.println (this.right);

}


public static void main (String [] args) {

    EncryptedNode en = new EncryptedNode("ABCDEF") ;

    en.decrypt();
}

public String decrypt () {
    if (this.left == null && this.right==null) {
        return this.letter;
    }else if (this.left == null && this.right != null) {
        return this.letter + this.right; 
    }else if (this.left !=null && this.right != null) {
        return this.left + this.letter + this.right;
    }
}

}

因为这是课堂作业,所以我不会为您编写代码,但是我可以解释您应该如何解决它。

您想向后遍历加密方法以便对其进行解密。 现在,无论加密的字符串是什么,您都只是返回“ st”。

我之前看错了代码。 这是一种递归方法,因此您必须从头开始并逐步进行。 您将必须解密左侧,然后解密右侧,并将它们添加在一起。

在解密方法中,您必须递归调用this.left.decrypt(); this.right.decrypt(); 直到您了解基本情况为止。 基本情况是左和右等于null时。 此时,您只需退回信件即可。 这是递归的底部。

因此,要编写您的解密方法,您想return this.left.decrypt() + this.letter + this.right.decrypt(); 除非this.left或this.right为null。

如果this.right为null,则return this.letter;

如果this.left为null,则return this.letter + this.right.decrypt();

对最初的困惑感到抱歉,我认为这是一个比实际要容易的任务。

希望这次我有所帮助!

解:

public String decrypt () {

    if (this.right == null) {
       return this.letter;
    }
    if (this.left == null) {
        return this.letter + this.right.decrypt();
    }
    return this.left.decrypt() + this.letter + this.right.decrypt();
}

您非常接近有效的解决方案。 请记住,根据您的规范,您将文本存储为letter + right + left而不是( left + letter + right )。

我正在发布解决方案,请仔细查看以了解其工作原理。 如果允许使用StringBuilder(或线程安全的StringBuffer),则在需要更改String的值时使用它们 (我将StringBuilder串联版本放在注释中)。

public static void main (String [] args) {

    EncryptedNode en = new EncryptedNode("ABCDEF") ;

    System.out.println(en.decrypt());
}

public String decrypt () {

    //if you are not allowed to use StringBuilder
    String s = String.valueOf(this.letter);
    if (this.right != null) {
        s = s + this.right.decrypt();
    }
    if (this.left != null) {
        s = s + this.left.decrypt();
    }
    return s;

    /*
    StringBuilder sb = new StringBuilder();
    sb.append(this.letter);
    if (this.right != null)
        sb.append(this.right.decrypt());
    if (this.left != null)
        sb.append(this.left.decrypt());
    return sb.toString();
    */
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM