[英]Able to decrypt an encrypted text in Java despite changing the encrypted text
[英]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.