簡體   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