Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 解决方案评论:颠倒句子中的单词_Java_Algorithm - Fatal编程技术网

Java 解决方案评论:颠倒句子中的单词

Java 解决方案评论:颠倒句子中的单词,java,algorithm,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 sent

我接受了一次技术面试,得到了以下问题:

编写一个函数,该函数接受一个句子并以相反的顺序返回包含单词的句子(即“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);
}
我开始思考,必须有一种比这更有效的方法来解决这个问题。我不认为在顶级公司的技术面试中会有人问这个问题,如果这个解决方案是最好的,没有比它更高效/优雅的了


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

除了注释,要使用更高效的数据结构(StringBuilder)来创建字符串,我认为您没有什么可以做的。反转数组的时间复杂度是
n/2
(),但是之后您仍然需要连接所有项,这些项应该是
n
-因为您要立即连接它们,所以您可以从
3n/2
降到仅
n
以下是连接句子元素的更好方法:


另外,
语句.split(\\s+”)
仅在输入干净时有效(人们会打字)。还有一个问题是标点符号应该怎么处理<代码>世界!您好,看起来确实很奇怪。

一旦您通过交换引用(长度为1的0等)来反转数组,您就可以

但我认为最好避免使用字符串数组

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() );

这假设输入字符串已正确“规范化”。

有时,在询问此问题时,会有一个约束条件,要求在不使用任何额外内存的情况下完成该问题

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

  • 首先将句子中的每个单词倒转(“Hello World”->“olleH dlroW”)
  • 然后倒转整个句子(“olleH dlroW”->“World Hello”)

  • 嗯。。使用
    StringBuilder
    而不是
    String reversedString
    。字符串连接(特别是在循环中)效率不高。有一个
    集合。反向
    方法:您可能可以使用它。如果helloworld?如果我的字符串只包含一个空格怎么办?虽然我不是那里的面试官,但他们肯定会寻找异常/边缘案例处理。是的,但是当你回过头来时\t你会回来吗?在深入研究答案之前,一定要询问用例。在速度和可维护性之间通常存在权衡。
    String.join
    也是一个不错的选择。即使它可能没有那么高效,它也是“开箱即用”的。
    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() );