【问题标题】:Decrypt encrypted text in java在java中解密加密文本
【发布时间】:2016-01-26 03:40:08
【问题描述】:

我有一个任务。我已经完成了任务的所有部分。但我对我的以下部分任务感到震惊。你能帮帮我吗

作业指南

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

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

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

四。编写如下方法:

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

我的示例代码是

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;
    }
}

}

【问题讨论】:

  • 我遇到了错误。需要修复它们。我需要以字符串格式返回解密消息

标签: java string encryption


【解决方案1】:

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

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

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

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

所以要编写你的解密方法,你想return this.left.decrypt() + this.letter + this.right.decrypt();unless this.left 或 this.right 为空。

如果 this.right 为空,你会return this.letter;

如果 this.left 为空,你会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();
}

【讨论】:

  • 返回“st”只是为了返回。需要解密的消息以字符串形式返回。
  • 修复了我的回复,我没有意识到这是递归的。
  • 为你写的。
  • 没问题!如果您可以使用,请选择此作为可行的解决方案。
  • @chinthaka 您能否选择此答案作为问题的答案,以便我获得声誉?
【解决方案2】:

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

我正在发布一个解决方案,请仔细查看以了解其工作原理。如果允许在需要更改 String 的值时使用 StringBuilder(或线程安全的 StringBuffer)use those(我将 StringBuilder 连接版本放在 cmets 中)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-30
    • 2011-08-06
    • 1970-01-01
    • 2016-03-11
    • 1970-01-01
    • 2012-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多