【问题标题】:Using recursion to reverse even indices of a String使用递归来反转字符串的偶数索引
【发布时间】:2014-03-30 07:10:57
【问题描述】:

对于我的递归方法的这一部分,我需要处理大于 2 的偶数长度字符串的情况(如我的基本情况所示)。我的问题是弄清楚如何让我的递归案例真正接近我的基本案例。我不确定我是否正确地执行了反转部分,因为由于基本情况从未被击中,我收到了 Stack Overflow 错误。 这是有问题的方法。 (我将在当前的“if”语句之后处理奇数字符串。我现在有“return 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;
   }

【问题讨论】:

  • "...当我收到 Stack Overflow 错误..." -- 哦,现在不要试图甜言蜜语...
  • 哈哈,我希望我是。我明白为什么我会收到错误。与我当前的解决方案相比,我尝试处理的所有基本情况都没有意义。
  • java.lang.StackOverflowError 在最后一个 return 语句上。不过,我确实说过。我还说我明白为什么会这样。这是因为我输入到递归方法中的字符串永远不会变小,所以它永远不会遇到基本情况,导致我的方法永远调用自己。

标签: java string recursion reverse


【解决方案1】:

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

"ABCD" = "ABC" (substring (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);
   }

【讨论】:

  • 感谢您的信息。我的教授说不要为此使用数组。这就是我选择使用 substring 和 charAt 方法的原因。
  • @CoinBird 如果你不能使用数组/索引,那么你不能使用 charAt(),它只是底层 char 数组中索引的花哨名称。
  • 对不起,我以为你说要将每个字符转移到一个数组中。我们应该将其保留为字符串。任何字符的切换都将通过字符串连接来完成。允许使用 charAt 和 substring 方法。
猜你喜欢
  • 1970-01-01
  • 2013-04-13
  • 2017-07-20
  • 2020-02-22
  • 2014-06-07
  • 2013-02-25
  • 2017-06-11
相关资源
最近更新 更多