我进行了技术访谈,并得到了以下问题:
编写一个带有句子的函数,并以相反的顺序返回带有单词的句子(即" 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);
}
我认为必须有一种更有效的方法来解决这个问题。如果这个解决方案成为最好的解决方案并且没有一个更有效/更优雅的话,我不会在技术面试中看到这个被问到一家顶级公司。
有人能想到更好的方法吗?
答案 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/2
(How 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)
有时这个问题会受到限制,要求在不使用任何额外内存的情况下完成。
这个修改过的问题的一个答案是: