解决方案批评:在一个句子中翻转单词

时间:2014-11-24 09:53:15

标签: java algorithm

我进行了技术访谈,并得到了以下问题:

  

编写一个带有句子的函数,并以相反的顺序返回带有单词的句子(即" hello world"变成" world hello")。

以下是我在Java中提供的解决方案:

/** Takes a sentence as an input and returns the sentence with the words in
 *  reversed order. */
private static String reverseSentence(String sentence) {
    String[] words = sentence.split("\\s+");
    String reversedString = "";
    for (int k = words.length - 1; k >= 0; k -= 1) {
        reversedString += " " + words[k];
    }
    return reversedString.substring(1);
}

我认为必须有一种更有效的方法来解决这个问题。如果这个解决方案成为最好的解决方案并且没有一个更有效/更优雅的话,我不会在技术面试中看到这个被问到一家顶级公司。

有人能想到更好的方法吗?

4 个答案:

答案 0 :(得分:1)

以下是连接句子元素的更好方法:What's the most elegant way to concatenate a list of values with delimiter in Java?

此外,sentence.split("\\s+")仅在输入清晰时才会起作用(人们确实会输错)。还有一些问题,标点符号会发生什么。 World! Hello,看起来很奇怪。

答案 1 :(得分:0)

除了注释,要使用更高效的数据结构(StringBuilder)来创建字符串,我认为你无法做多少。反转数组的时间复杂度为n/2How do I reverse an int array in Java?),但之后您仍然需要连接所有项目,这些项目应为n - 因为您正在将它们连接起来你从3n/2下到n

答案 2 :(得分:0)

通过交换引用(0表示长度为1等)来反转数组后,您可以

String reversedSentence = String.join( " ", words );

但我认为最好避免使用String数组。

String s = "the quick brown fox";
StringBuilder sb = new StringBuilder();
int p = s.length();
int np = -1;
while( (np = s.lastIndexOf( " ", p-1 )) != -1 ){
    sb.append( s.substring( np + 1, p ) ).append( " " );
    p = np; 
}
sb.append( s.substring( 0, p ) );
System.out.println( sb.toString() );

这假定输入字符串正确"标准化"。

答案 3 :(得分:0)

有时这个问题会受到限制,要求在不使用任何额外内存的情况下完成。

这个修改过的问题的一个答案是:

  1. 首先翻译句子中的每个单词(“Hello World” - >“olleH dlroW”)
  2. 然后反转整个句子(“olleH dlroW” - >“World Hello”)