我有一项任务。我完成了作业的所有部分。但是,我的任务中有一部分受到打击。你能帮我吗
作业指南
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;
}
}
}
答案 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();
*/
}