【问题标题】:Reverse a string using recursion in java在java中使用递归来反转字符串
【发布时间】:2020-02-22 21:35:37
【问题描述】:

我想反转整个String。例如,“Cat is running”应该给出输出“running is cat”。

我已经尝试了很多,但我无法做到。它显示“gninnur si taC”。请帮助我,它应该将“cat”作为单个字符,而不是将“c”作为单个字符。

代码如下:

public static void main(String[] args) {
    String str = "Cat is running";
    System.out.println("Before recursion: " + str);
    System.out.println("After recursion: " + reverse(str));
}

public static String reverse(String str) {
    if(str.isEmpty())
        return str;

    String s = "";
    for(int i = 0; i < str.length(); i++) {
        s = s + str.charAt(i);
    }
    return reverse(s.substring(1)) + s.charAt(0);   
}

【问题讨论】:

  • 根据“字符”的定义,"cat" 不是字符而是单词。

标签: java recursion substring reverse


【解决方案1】:

您必须找到String 中的第一个单词,将String 的其余部分传递给递归调用,并将第一个单词附加到末尾:

public static String reverse(String str) {
    if(str.isEmpty() || !str.contains(" "))
        return str;

    int sep = str.indexOf(' ');
    return reverse(str.substring(sep+1)) + " " + str.substring(0,sep);   
}

输出:

Before recursion: Cat is running
After recursion: running is Cat

顺便说一句,循环是您的原始代码毫无意义。您可以直接使用str,而不是创建它的副本。

您可以使用以下方法使其更短:

public static String reverse(String str) {
    int sep = str.indexOf(' ');
    return sep >= 0 ? reverse(str.substring(sep+1)) + " " + str.substring(0,sep) : str;
}

【讨论】:

  • 你能证明语句 !str.contais(" ") 和 str.indexOf(' ') 的合理性吗?我无法理解。这些陈述中实际发生了什么?
  • @Yahya 如果字符串不包含空格,则表示它只有一个单词,不应颠倒。因此,!str.contains(" ") 检查。一旦我们知道字符串在空间列表中,我们使用indexOf(' ') 来定位第一个空间的索引。然后我们使用substring 将第一个单词与字符串的其余部分分开。我们将字符串的其余部分传递给下一个递归调用,然后在末尾附加一个空格 + 第一个单词。
【解决方案2】:

我觉得我做得比 @Eran 差一点,但我已经写了:

private static String reverse(String str) {
    if (str.isEmpty() || !str.contains(" "))
        return str;
    StringBuilder sb = new StringBuilder(" ");
    int i = 0;
    while (i < str.length() && str.charAt(i) != ' ') {
        sb.append(str.charAt(i));
        i++;
    }
    return reverse(str.substring(i + 1)) + sb.toString();
}

【讨论】:

    猜你喜欢
    • 2014-06-07
    • 2012-04-01
    • 1970-01-01
    • 2013-04-13
    • 2018-04-05
    • 2020-02-17
    • 2017-07-20
    • 2020-06-28
    相关资源
    最近更新 更多