在Java中反转给定的句子

14

有谁能告诉我如何编写一个Java程序来反转给定的句子吗?

例如,如果输入是:

"This is an interview question"

输出必须是:

"question interview an is this"


1
首先将字符串翻转。再将单词翻转。这需要两次迭代,但非常简洁。也可以只用一次迭代完成。 - Jack
1
@jack,我认为你的第一个单词应该是“split”,对吗? - CPerkins
2
@CPerkins:好吧,“the question” -> “noitseuq eht” -> “question the” 仍然有效,我猜这就是Jack的意思,因为回答者已经按照你的方式发布了答案。 - Pops
这是一个面试问题 - Jack
参见:https://dev59.com/xXNA5IYBdhLWcg3wVcFx - Adam Michalik
显示剩余2条评论
14个回答

24

您可以通过空格将字符串分割,然后倒序迭代它来组装反转的句子。

String[] words =  "This is interview question".split(" ");

String rev = "";
for(int i = words.length - 1; i >= 0 ; i--)
{
   rev += words[i] + " ";
}

// rev = "question interview is This "

// can also use StringBuilder:
StringBuilder revb = new StringBuilder();
for(int i = words.length - 1; i >= 0 ; i--)
{
   revb.append(words[i]);
   revb.append(" ");
}
// revb.toString() = "question interview is This "

7
这样做会不会添加一个尾随空格? - Skilldrick
2
你为什么要使用字符串连接(每次都会创建一个新的字符串对象),而不是使用 StringBuilder? - Christopher Parker
@Christopher Parker - 简单地展示原理。当然,如果需要,这可以被调整为更高效的方式。 - Oded
1
@Skilldrick - 使用 Rev.trim(); 去除尾随空格。虽然问题没有指定,但像您一样,我也不喜欢那样的额外空格。 - Onion-Knight
我不会使用trim() - 它会创建一个全新的字符串。在我的看法中,最好在循环内执行第二次i的检查。 - Adamski
https://codereview.stackexchange.com/a/60913/146446 对这段代码进行了更详细的解释,并且还有很棒的单元测试。 - Tot Zam

24
String[] words = sentence.split(" ");
String[] reversedWords = ArrayUtils.reverse(words);
String reversedSentence = StringUtils.join(reversedWords, " ");

(使用 ArrayUtils和commons-lang的StringUtils,但这些都是易于编写的方法-只需要几个循环)


7
在面试问题如此简单的情况下使用外部库不太好。 - D'Nabre
5
好的。这道题目并不简单,它涉及到离开图书馆进行采访。需要使用外部资源。 - Powerlord
5
如果你足够熟悉 commons-lang 来编写那段代码,我认为它将非常适用。 - Thorbjørn Ravn Andersen
1
@D'Nabre 我不这么认为。如果他们要求你解释这些实用方法是如何实现的,你总是能够解释,但这样你就增加了代码的优雅性。如果这些方法存在于 java.util.Arrays 中呢? - Bozho
在印度,他们会告诉你“请不要使用任何库方法,否则它将不会被考虑”,但实际上这样做并不好。 - Sujal Mandal
显示剩余4条评论

21

仅仅不同:一种递归解决方案。不会添加任何额外的空格。

public static String reverse(String s) {
   int k = s.indexOf(" ");
   return k == -1 ? s : reverse(s.substring(k + 1)) + " " + s.substring(0, k);
}


System.out.println("[" + reverse("This is interview question") + "]");
// prints "[question interview is This]"

我将使用\b来改进split的解决方案(这太明显了!)。

    String[] parts = "Word boundary is better than space".split("\\b");
    StringBuilder sb = new StringBuilder();
    for (int i = parts.length; i --> 0 ;) {
        sb.append(parts[i]);
    }
    System.out.println("[" + sb.toString() + "]");
    // prints "[space than better is boundary Word]"

不错,我真的很喜欢递归解决方案设计,但迭代+字符串构建器必须更快,对吧? - user797963

6

只需将其在空格字符上拆分为字符串数组,然后以相反的顺序循环遍历数组并构造输出字符串。

String input = "This is interview question";
String output = "";
String[] array = input.split(" ");
for(int i = array.length-1; i >= 0; i--)
{
    output += array[i];
    if (i != 0) { output += " "; }
}

6

Bozho已经给出了一个很好的Java特定的答案,但如果您需要在没有Java API方法的情况下解决此问题:

要反转,您可以简单地将单个单词弹出到堆栈中,并在没有单词时将它们全部弹出。

(只是为了更加清晰,Java确实提供了一个Stack,因此也可以在Java中使用这种方法)。


3

让人感到枯燥无味的Java细节:

List<String> l = new ArrayList<String>(Arrays.asList("this is an interview question".split("\\s")));
Collections.reverse(l);
StringBuffer b = new StringBuffer();
for( String s : l ){
    b.append(s).append(' ');
}
b.toString().trim();

在Groovy中,代码更易读:

"this is an interview question"
    .split("\\s")
    .reverse()
    .join(' ')

@Oded的方式更好...习惯于只使用集合。 - Gareth Davis

3
我也试了一下:这里有一个使用堆栈和扫描器的版本:
String input = "this is interview question";
Scanner sc = new Scanner(input);
Stack<String> stack = new Stack<String>();

while(sc.hasNext()) {
    stack.push(sc.next());
}

StringBuilder output = new StringBuilder();

for(;;) { // forever
    output.append(stack.pop());

    if(stack.isEmpty()) {
        break; // end loop
    } else {
        output.append(" ");
    }
}

2
public class ReverseString {

    public void reverse(String[] source) {

        String dest = "";
        for (int n = source.length - 1; n >= 0; n--) {
            dest += source[n] + " ";
        }
        System.out.println(dest);

    }

    public static void main(String args[]) {
        ReverseString rs = new ReverseString();
        String[] str = "What is going on".split(" ");
        rs.reverse(str);

    }

}

1

请尝试以下解决方案,这对我有效。

public class reverseline {

public static void main(String[] args) {
    // TODO Auto-generated method stub

        String str="This is interview question";
    String words[]=str.split(" ");
    for(int i=words.length-1;i>=0;i--){
        System.out.print(words[i]+" ");
    }
}

}

1

可能有更好的方法..在某个地方看到过这个逻辑..这是我的代码,也许可以完成工作。

    public class revWords {

    public static void main(String[] args) {

        revWords obj = new revWords();
        String print = obj.reverseWords("I am God");
        System.out.println(print);

    }

    public String reverseWords(String words)
    {
      if(words == null || words.isEmpty() || !words.contains(" "))
        return words;

      String reversed = "";
      for( String word : words.split(" "))
        reversed = word + " " + reversed;

      return reversed;
    }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接