0

只是简单的反向字符串方法。仅供参考,正确的方法是 reverseString1 和 reverseString2,但 revereStirng3() 并没有给我正确的输出。我认为这是因为方法参数和返回值存储在堆栈中并与此概念相关。但我不清楚为什么 revereStirng3() 不能正常工作。请让我知道这不起作用。

这是我理解的,如果我错了,请纠正我。1. main() 调用 revereStirng3(A),其中传递的参数数组 A 存储在 main() 的堆栈帧中。

  1. revereStirng3(char[] A) 其中这个传递的参数数组 A 存储在 revereStirng3 的方法框架中,这意味着 main 的 A[] 被复制到 revereStirng3 的堆栈框架的方法参数 A[]。

  2. 反向后,revereStirng3 为返回字符串创建新的 String(A)。

  3. 然后,我认为,返回的 new String(A) 主要是正确打印反转字符串,但实际上不是。

    // 给定一个字符串“abcdef”,反转它。所以输出应该是“fedcba”

    import java.util.*;
    
    public class ReverseString {
    
        static String revereStirng3(char[] A) {    
            int n = A.length;       
    
            for(int i=0; i<n/2; i++) {
                char temp = A[n-i-1];
                A[n-i-1] = A[i];
                A[i] = temp;
            }
    
            return new String(A);
        }
    
        static void revereStirng1(char[] A) {
            int n = A.length;       
    
            for(int i=0; i<n/2; i++) {
                char temp = A[n-i-1];
                A[n-i-1] = A[i];
                A[i] = temp;
            }
        }
    
        static String revereStirng2(String str) {
            char[] A = str.toCharArray();
            int n = A.length;       
    
            for(int i=0; i<n/2; i++) {
                char temp = A[n-i-1];
                A[n-i-1] = A[i];
                A[i] = temp;
            }
    
            return String.valueOf(A);
        }
    
        public static void main(String[] args) {
            String s = "abcdef";
            char[] A = s.toCharArray();
    
            System.out.print( revereStirng3(A) + "\n" );   **// print out "abcdef"**
            System.out.println( "" );
    
            revereStirng1(A);                              // print out "fedcba"
            for(int i=0; i<A.length; i++)
                System.out.print( A[i] );
            System.out.println( "" );
    
            System.out.print( revereStirng2(s) + "\n" );    // print out "fedcba"
            System.out.println( "" );
    
    
        }
    }
    
4

3 回答 3

1

好的,鉴于 zenbeni 已经得到了真正的结果,这就是正在发生的事情。

Java 中的数组是一个对象,因此在 中revereString1revereString3您将获得对数组的引用的副本。因此,您的更改会修改原始数组,该数组(在第一个方法执行之后)已被反转。当然,第二次执行又把它反转了,所以你得到了reverse的reverse,也就是原来的String。

尝试使用一个新的、本地定义的数组来创建反向字符串,一切都会正常工作。

于 2013-09-09T15:43:52.957 回答
0

我已经复制了你的方法并执行了它

System.out.println(revereStirng3("abcdef".toCharArray()));

结果是

fedcba.

问题出在main函数中:

 public static void main(String[] args) {
        String s = "abcdef";
        char[] A = s.toCharArray();

        System.out.println( revereStirng3(A));  // print out "abcdef"**

        revereStirng1(A);                       

        System.out.print(Arrays.toString(A));   // print out "fedcba"

        System.out.println(revereStirng2(s));   // print out "fedcba"
    }

您的评论并不真实。

它的有效输出是

fedcba
[a,b,c,d,e,f]
fedcba

这是因为您对三个测试用例在同一个数组上进行操作。在第二步中,您将所有已反转的数组作为输入传递。这导致顺序没有改变。

于 2013-09-09T15:59:42.377 回答
0

来自 apache commons:

StringUtil.reverse(str);
于 2013-09-09T15:45:08.927 回答