【问题标题】:Program to reverse the words in a string [closed]反转字符串中的单词的程序[关闭]
【发布时间】:2016-02-19 14:09:09
【问题描述】:

我编写了一个程序来反转字符串中的单词。 如果 i/p 是“狗在追” 那么o/p应该是“追是狗”

public class String_reverse {

    public static void main(String[] args) {

        String input= "The dog is chasing";

        String[] arr= input.split(" ");
        String reverse="";
        for(int i=arr.length-1;i>=0;i--)
        {
            reverse+= ((reverse.equals(""))?"":" ")+arr[i];
        }
        System.out.println(reverse);

    }

}

但我不知道如何使用递归编写这个程序。当我尝试在 stackoverflow 中搜索时,我可以找到反转字符串;但不反转字符串中的单词。

【问题讨论】:

  • 先从一般的角度考虑它,而不是专门考虑 Java。在任何给定的递归调用中,您都有一个当前单词和句子的其余部分。你会怎么做?你会显示当前的单词,然后做剩下的句子吗?或者是其他东西?当然,当您用完单词(或最后一个单词)时,您需要注意这种情况。
  • 没有。它不是重复的。在那个问题中,他们正在反转一个字符串。例如:你好 olleH
  • @SethuramanSrinivasan 这是一样的,只是你附加了第一个单词,而不是第一个字符,并且带有一个空格分隔符。
  • @Andreas 你如何子串一个数组?

标签: java recursion


【解决方案1】:

这是一个示例程序,它将递归地执行您想要的操作:

public class ReverseWords {
    public static void main(String args[]) {
        String s = "This is a test";
        reverse(s);
    }

    private static void reverse(String s) {
        if(s == null) return;
        String words[] = s.split(" ", 2);
        if (words.length < 2) reverse(null);
        else reverse(words[1]);
        System.out.print(words[0] + " ");
    }
}

【讨论】:

    【解决方案2】:

    Recursive methods 刚开始可能有点困难,但请尝试执行以下操作:

    • 尽可能地简化问题,找到要解决的不太复杂的案例。 (例如,您可以使用一个包含两个单词的句子)。

    • 从在纸上开始,使用Pseudocode 以尽可能简单的语言帮助您处理问题。

    • 开始编码,不要忘记转义到递归。


    解决方案

    public static void main(String[] args) {
        String s = reverseSentence("This sentence will be reversed - I swear".split(" "));
        System.out.println(s);
    }
    
    public static String reverseSentence(String[] sentence){
        if (sentence.length <= 1){
            return sentence[0];
        }
        String[] newArray = new String[sentence.length-1];
        for (int i = 0 ; i < newArray.length ; i++){
            newArray[i] = sentence[i];
        }
        return sentence[sentence.length-1] + " " + reverseSentence(newArray);
    }
    

    【讨论】:

    • 数组克隆开销很大,需要调用者通过调用split()来准备数据。
    【解决方案3】:

    递归方法,使用与linked "duplicate"相同的逻辑,不使用split()

    private static String reverseWords(String text) {
        int idx = text.indexOf(' ');
        return (idx == -1 ? text : reverseWords(text.substring(idx + 1)) + ' ' + text.substring(0, idx));
    }
    

    逻辑是:

    1. 取第一个字符/单词
    2. 如果这是最后一个字符/单词,则返回
    3. 对剩余文本(不包括分词空格)执行递归调用。
    4. 追加空格(如果做单词)
    5. 附加第 1 步中的第一个字符/单词
    6. 返回结果

    如您所见,当应用于反转文本(字符)而不是单词时,它非常相似:

    private static String reverseText(String text) {
        return (text.length() <= 1 ? text : reverseText(text.substring(1)) + text.charAt(0));
    }
    

    对于喜欢拼写但不喜欢三元运算符的人,这里是长版本,带有额外的大括号并支持空值:

    private static String reverseWords(String text) {
        if (text == null) {
            return null;
        }
        int idx = text.indexOf(' ');
        if (idx == -1) {
            return text;
        }
        return reverseWords(text.substring(idx + 1)) + ' ' + text.substring(0, idx);
    }
    private static String reverseText(String text) {
        if (text == null || text.length() <= 1) {
            return text;
        }
        return reverseText(text.substring(1)) + text.charAt(0);
    }
    

    注意reverseText() 的长版本与链接副本中的版本完全相同。

    【讨论】:

      【解决方案4】:

      您可以参考以下代码。

        class ReverseString {
      
      public static void main(String args[]) {
          String myString = "The dog is chasing";
      
          reverse(myString);
      }
      
      public static String reverse(String myString) {
          int space = myString.indexOf(" ");
          if (space != -1) {
              reverse(myString.substring(space + 1, myString.length()));
          }
          if (space == -1) {
              System.out.println(myString.substring(0, myString.length()));
          } else {
              System.out.println(myString.substring(0, space));
          }
          return myString;
      }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-09
        • 2021-12-09
        • 2010-11-03
        • 2011-11-07
        • 1970-01-01
        • 1970-01-01
        • 2020-12-09
        • 2015-12-13
        相关资源
        最近更新 更多