Java 字符串插入的循环问题

Java 字符串插入的循环问题,java,Java,所以我的上一个问题出轨了,但我解决了问题(编译错误,很多)。现在我至少有一个逻辑错误,也许两个。该程序的目的是通过反转字符串并在每个“实”字符之间添加一定数量的随机字母来“加密”字符串,具体取决于“难度”值。是代码的全部 下面是我认为会给我带来问题的部分,更具体地说,我很确定这与我的x=x+diff语句有关,但我不知道如何移动“光标”。 --从Decryptor.java中剪切-- /** decryptString使用难度作为增量对代码进行解密。 @param编码加密的字符串 @return已

所以我的上一个问题出轨了,但我解决了问题(编译错误,很多)。现在我至少有一个逻辑错误,也许两个。该程序的目的是通过反转字符串并在每个“实”字符之间添加一定数量的随机字母来“加密”字符串,具体取决于“难度”值。是代码的全部

下面是我认为会给我带来问题的部分,更具体地说,我很确定这与我的
x=x+diff
语句有关,但我不知道如何移动“光标”。 --从Decryptor.java中剪切--

/**
decryptString使用难度作为增量对代码进行解密。
@param编码加密的字符串
@return已解密已解密的字符串
*/
公共字符串解密字符串(字符串代码)
{
int length=code.length();
int x=0;//到1
encryptedStr=代码;
String codeRev=新的StringBuilder(代码).reverse().toString();
StringBuilder decrypted=新StringBuilder();

对于(int pos=0;pos我很确定这应该是一个更严格的
pos

for (int pos = 0; pos < length - 1; pos++)

然后删除x。如果(diff==0)

我很确定这应该是一个更严格的
pos

for (int pos = 0; pos < length - 1; pos++)

如果(diff==0)
算法中有一些错误,只需跳过for
。
首先,您不希望迭代
长度
,因为字符串的长度正在更改。 解决方案:这对我来说非常有效

   public static String decryptString(String code)
{
    int length = code.length();
    int x = 0; 

    String codeRev = code;

    StringBuilder decrypted = new StringBuilder();

    while(x < codeRev.length())
    {
        for(int i = x; i< x + diff && i < codeRev.length();i++)
           decrypted.append(codeRev.charAt(i));

        x += diff + 1;
    }
    decrypted = decrypted.reverse();
    return(decrypted).toString();
}
public static String encryptString(String str)
{
    int length = str.length();
    String origStr = str;
    int x = diff;
    StringBuilder codeRev = new StringBuilder(str).reverse();

    while (x < codeRev.length())
    {
        codeRev.insert(x, " ");
        x += diff + 1;
    }
    return(codeRev).toString();

}
公共静态字符串解密字符串(字符串代码)
{
int length=code.length();
int x=0;
字符串codeRev=代码;
StringBuilder decrypted=新StringBuilder();
而(x
算法中有一些错误。 首先,您不希望迭代
长度
,因为字符串的长度正在更改。 解决方案:这对我来说非常有效

   public static String decryptString(String code)
{
    int length = code.length();
    int x = 0; 

    String codeRev = code;

    StringBuilder decrypted = new StringBuilder();

    while(x < codeRev.length())
    {
        for(int i = x; i< x + diff && i < codeRev.length();i++)
           decrypted.append(codeRev.charAt(i));

        x += diff + 1;
    }
    decrypted = decrypted.reverse();
    return(decrypted).toString();
}
public static String encryptString(String str)
{
    int length = str.length();
    String origStr = str;
    int x = diff;
    StringBuilder codeRev = new StringBuilder(str).reverse();

    while (x < codeRev.length())
    {
        codeRev.insert(x, " ");
        x += diff + 1;
    }
    return(codeRev).toString();

}
公共静态字符串解密字符串(字符串代码)
{
int length=code.length();
int x=0;
字符串codeRev=代码;
StringBuilder decrypted=新StringBuilder();
而(x
尚未验证您的代码,但应该不会太难

对于解密,假设我们有一个字符串

A_B_C_D  (difficulty = 1), 
您可以做的是将光标设置到末尾(并附加到结果):

对于每次迭代,向后移动
diff+1
元素,例如在本例中向后移动2

A_B_C_D
    ^
直到您通过索引0。 这是psuedo代码

String decrypt(String encryptedString) {
    int i = encryptedString.length() - 1;
    String result = "" ;  // use a String builder in real life of course

    for (int i = encryptedString.length() - 1   // last index
            ; i >= 0
            ; i -= (diff + 1) ) {
        result += encryptedString[i];
    }
    return result;
}
就是这么简单,这样可以避免在不损失可读性的情况下执行反向操作(从而节省不必要的内存浪费)的额外步骤

加密更容易:

String encrypt (String input) {
    String result;
    for (int i = input.length() - 1
            ; i >= 0
            ; --i) {
        result += input[i];
        if (i > 0) {
            append "diff" number of random character to result
        }
    }
    return result;
}

尚未验证您的代码,但应该不会太难

对于解密,假设我们有一个字符串

A_B_C_D  (difficulty = 1), 
您可以做的是将光标设置到末尾(并附加到结果):

对于每次迭代,向后移动
diff+1
元素,例如在本例中向后移动2

A_B_C_D
    ^
直到您通过索引0。 这是psuedo代码

String decrypt(String encryptedString) {
    int i = encryptedString.length() - 1;
    String result = "" ;  // use a String builder in real life of course

    for (int i = encryptedString.length() - 1   // last index
            ; i >= 0
            ; i -= (diff + 1) ) {
        result += encryptedString[i];
    }
    return result;
}
就是这么简单,这样可以避免在不损失可读性的情况下执行反向操作(从而节省不必要的内存浪费)的额外步骤

加密更容易:

String encrypt (String input) {
    String result;
    for (int i = input.length() - 1
            ; i >= 0
            ; --i) {
        result += input[i];
        if (i > 0) {
            append "diff" number of random character to result
        }
    }
    return result;
}

因此,您重组它的方式当然是有意义的,但我无法让程序再正确运行了。下面是我得到的运行时错误:======================================================================模拟难度级别0:线程“main”java.lang.OutOfMemoryError中的异常:java.util.Arrays.copyOf中的java堆空间(Arrays.java:3332)在java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:137)在java.lang.AbstractStringBuilder.EncurrencAcityInternal(AbstractStringBuilder.java:121)在java.lang.StringBuilder.insert(AbstractStringBuilder.java:1187)在java.lang.StringBuilder.encryptString.insert(StringBuilder.java:338)在Encryptor.encryptString(Encryptor.java:32)在Simulator.main(Simulator.java:28)尝试调试并找到问题。因此,您重新构造它的方式肯定是有意义的,但我无法使程序再正确运行。下面是我得到的运行时错误:==============================================================================模拟难度级别0:线程“main”中的异常java.lang.OutOfMemoryError:java.util.Arrays.copyOf(Arrays.java:3332)java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:137)java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:121)java.lang.AbstractStringBuilder.java:1187在Simulator.main(Simulator.java:28)中的Encryptor.encryptString(Encryptor.java:32)中的java.lang.StringBuilder.insert(StringBuilder.java:338)尝试调试并找到与上述方法相反的问题,您的方法不会导致运行时错误,并且似乎也在正确的轨道上,但它仍然存在