将数组交换到其原始状态

Swapping an array to its original state

我一直在执行数组相关测试,我尝试按照特定模式交换数组,然后我尝试将数组交换回它最初使用模式的方式,但它始终有效。当我进行测试时,我 运行 遇到了一个棘手的情况,我的反转模式根本没有发挥作用!我决定 post 我的问题在这里,看看是否有人知道我在尝试反转我的数组时遗漏了什么!数组是不可逆的吗?

数组以及交换模式:

String[] strs = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};

        for(int i = 0; i<strs.length-2; i++){
            String temp = strs[i];
            strs[i] = strs[i+2];
            strs[i+2] = temp;

            for(int r = 0; r<strs.length-6; r++){
                String temp2 = strs[r];
                strs[r] = strs[r+6];
                strs[r+6] = temp2;

                for(int s = 0; s<strs.length-4; s++){
                    String temp3 = strs[s];
                    strs[s] = strs[s+4];
                    strs[s+4] = temp3;

                    for(int t = 0; t<strs.length-2; t++){
                        String temp4 = strs[t];
                        strs[t] = strs[t+2];
                        strs[t+2] = temp4;
                    }
                }
            }
        }

结果:G B E H I N M T O D A L S V Q P W F Y X C J K R U Z

我最初尝试使用相同的反向公式还原数组 但即使它在没有索引越界异常的情况下进行编译,它仍然不会将数组恢复到其原始状态!

 for(int i = 0; i<strs.length; i++)
        System.out.print(strs[i]+" ");
        System.out.println("");

        for(int i = strs.length-3; i>=0; i--){
            String temp = strs[i];
            strs[i] = strs[i+2];
            strs[i+2] = temp;

            for(int r = strs.length-7; r>=0; r--){
                String temp2 = strs[r];
                strs[r] = strs[r+6];
                strs[r+6] = temp2;

                for(int s = strs.length-5; s>=0; s--){
                    String temp3 = strs[s];
                    strs[s] = strs[s+4];
                    strs[s+4] = temp3;

                    for(int t = strs.length-3; t>=0; t--){
                        String temp4 = strs[t];
                        strs[t] = strs[t+2];
                        strs[t+2] = temp4;
                    }
                }
            }

        }

        for(int i = 0; i<strs.length; i++)
        System.out.print(strs[i]+" ");

结果:G N O P W R E B C H A D I T Q Z K L M V S F Y J U X

这是

建议的反转版本
for(int i = 0; i<strs.length-2; i++){
            String temp = strs[i];
            strs[i] = strs[i+2];
            strs[i+2] = temp;

            for(int r = 0; r<strs.length-6; r++){
                String temp2 = strs[r];
                strs[r] = strs[r+6];
                strs[r+6] = temp2;

                for(int s = 0; s<strs.length-4; s++){
                    String temp3 = strs[s];
                    strs[s] = strs[s+4];
                    strs[s+4] = temp3;

                    for(int t = 0; t<strs.length-2; t++){
                        String temp4 = strs[t];
                        strs[t] = strs[t+2];
                        strs[t+2] = temp4;
                    }
                }
            }
        }

结果:I X Y B E N K T G P S D Q Z O F A H M V U L C J W R

我想避免在这种情况下为您编写解决方案代码,但问题与您的反转代码循环的起始位置有关。仔细检查这些位置,使用调试器(如果您使用的是 IDE,大多数都内置了这些),然后逐行检查代码。

您会发现您没有从正确的位置开始。

此外,最好始终在任何循环或条件语句之后使用大括号。我在您的代码中注意到,您有两种情况可能会给您的 reader 带来很多混乱。另外,它将帮助您重新适应代码。在您的反向代码中:

for(int i = 0; i<strs.length; i++)
    System.out.print(strs[i]+" ");
    System.out.println("");

// Other loops...

for(int i = 0; i<strs.length; i++)
    System.out.print(strs[i]+" ");

变成

for(int i = 0; i<strs.length; i++) {
    System.out.print(strs[i]+" ");
}
System.out.println("");

// Other loops...

for(int i = 0; i<strs.length; i++) {
    System.out.print(strs[i]+" ");
}

之所以没有恢复到原来的状态,是因为你的反转算法嵌套不正确。

假设您有多个嵌套 for 循环,请考虑此伪代码。

for 1 to 1
     System.out.println("Step 1");

         for 1 to 1
               System.out.println("Step 2")

                       for 1 to 1
                              System.out.println("Step 3")

当运行这个时候,它会打印出第1步,然后是第2步,最后是第3步,对吧?

所以当你想要反转你的算法时,你需要按照相反的顺序执行这些步骤。所以需要先进行步骤3,然后是步骤2,最后是步骤1。

这可能就像颠倒嵌套 for 循环的顺序一样简单,但它也不可能 - 我不完全确定,老实说,我真的不想深入研究这个问题,因为当有这么多嵌套的 for 循环时,我的心开始痛了哈哈。但我希望这能让你走上正轨,如果你有任何问题,请告诉我。

附带说明一下,我强烈建议您考虑重写部分代码 - 我不认为嵌套 for 循环是完全必要的,删除它们会大大提高代码的可读性,因为您可能已经注意到,这真的非常非常重要。

为了反转你之前的算法,你还需要将每个循环中的块顺序(先主交换,然后内循环)反转为(先内循环然后交换),就像这样:

      for(int i = strs.length-3; i>=0; i--)  {         

        for(int r = strs.length-7; r>=0; r--) {                

            for(int s = strs.length-5; s>=0; s--) {                   

                for(int t = strs.length-1; t>=3; t--) {                        
                    String temp4 = strs[t];
                    strs[t] = strs[t-3];
                    strs[t-3] = temp4;
                 }   

                String temp3 = strs[s];
                strs[s] = strs[s+4];
                strs[s+4] = temp3;                    
             }

            String temp2 = strs[r];
            strs[r] = strs[r+6];
            strs[r+6] = temp2; 
         }

        String temp = strs[i];
        strs[i] = strs[i+2];
        strs[i+2] = temp;
     } 

这实际上会使您的数组恢复到原来的状态。试试吧。