使用递归来反转String的索引

时间:2014-02-27 03:49:16

标签: java string recursion reverse

对于这部分递归方法,我需要处理大于2的偶数长度字符串的情况(如我的基本情况所示)。我的问题是弄清楚如何使我的递归案例实际上接近我的基本案例。我不确定我是否也正确地执行了反转部分,因为基本情况从未被击中而导致Stack Overflow错误。 这是有问题的方法。 (我将在当前的'if'语句之后处理奇数字符串。我现在有“返回null”,所以我可以在没有奇数的情况下测试我的偶数情况。)

编辑: 输入示例:ABCDEF 示例输出:EBCDAF

public static String revEven(String inString)
   {
      String tempString = new String();

      if (inString.length() <= 2)
         return inString;
      if (inString.length() == 3)
         {
         tempString += inString.charAt(2);  
         tempString += inString.charAt(1);
         tempString += inString.charAt(0);

         return tempString;
         }
      if (inString.length() % 2 == 0)
         {
         return revEven(inString.substring(0, inString.length() - 1) + inString.charAt(inString.length() - 1));
         }
      return null;
   }

1 个答案:

答案 0 :(得分:1)

你得到StackOverflowError的原因是你的字符串在递归调用之间不会改变。在再次调用该函数的行中,您只需重新创建初始字符串。

“ABCD”=“ABC”(子串(0,3))+“D”(charAt(3)) - 相同的字符串。

提示。不要尝试在递归调用中更改字符串。 也许最好将你的字符串表示为字符数组,在递归调用中更改索引,然后在偶数索引指向的地方交换字符。

我没有查看角落案件,但想法如下:

public static String runEven(String string) {
     char[] array =  runEvenImpl(string.toCharArray(), 0, string.length());
     return new String(array);
}

public static char[] revEvenImpl(char[] array, int head, int tail) {
      if (head == tail)
         return array;
      if (head % 2 == 0 && tail % 2 == 0)
      {
           swap(array, head, tail);
      }
      revEven(array, head+1, tail-1);
   }