解密java中的加密文本

时间:2016-01-26 03:40:09

标签: java string encryption

我有一项任务。我完成了作业的所有部分。但是,我的任务中有一部分受到打击。你能帮我吗

作业指南

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

从1到中间字符应该转到右边的EncryptedNode,剩下的无人认领

字符应该在左边的EncryptedNode。注意:您将从中实例化新的EncryptedNode对象 这个构造函数,从而创建了一个递归构造。

IV。写下面的方法:

一个。 decrypt方法不带参数并返回String。此方法应通过递归添加每个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;
    }
}

}

2 个答案:

答案 0 :(得分:1)

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

您希望通过加密方法向后工作以解密它。现在,无论加密字符串是什么,你只是返回“st”。

我之前误读了代码。 这是一种递归方法,因此您必须从底部开始并逐步完成。你将不得不解密左侧,然后解密右侧并将它们加在一起。

在decrypt方法中,您必须递归调用this.left.decrypt();this.right.decrypt();,直到找到基本案例。基本情况是左和右等于null。那时你就回信了。这是递归的底部。

所以要编写解密方法,除非this.left或this.right为null,否则你想要return this.left.decrypt() + this.letter + this.right.decrypt();

如果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();
}

答案 1 :(得分:1)

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

我正在发布一个解决方案,仔细看看它是如何工作的。如果您需要更改String的值(我在注释中放置StringBuilder连接版本),则允许您使用StringBuilder(或线程安全的StringBuffer)use those

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();
    */
}