Java 解决方案评论:颠倒句子中的单词
我接受了一次技术面试,得到了以下问题: 编写一个函数,该函数接受一个句子并以相反的顺序返回包含单词的句子(即“hello world”变为“world hello”) 以下是我用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
/** 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() );
这假设输入字符串已正确“规范化”。有时,在询问此问题时,会有一个约束条件,要求在不使用任何额外内存的情况下完成该问题 对这一修改后的问题的一个答案是:
嗯。。使用
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() );