【发布时间】:2020-07-16 03:35:34
【问题描述】:
我有以下代码,使用参数-Xmx<1024M> 运行需要超过 5 秒。
我知道for 循环需要O(q) 时间,reverse() 和toString() 分别需要O(n) 时间。
有没有办法在少于O(n) 的时间内反转字符串?还是有其他东西减慢了代码速度?欢迎任何帮助!
class Main {
public static void main(String[] args){
String s = "a";
String qa = "200000";
int q = Integer.parseInt(qa);
String[] t = new String[q];
for(int i = 0; i < q; i++) {
if(i%2==0) {t[i] = "2 1 x";}
if(i%2==1) {t[i] = "1";}
if(t[i].toCharArray()[0] == '1') {
StringBuilder rev = new StringBuilder(s).reverse();
s = rev.toString();
} else {
char letter = t[i].toCharArray()[4];
if(t[i].toCharArray()[2] == '1') {
s = letter + s;
} else {
s = s + letter;
}
}
}
System.out.println(s);
}
}
【问题讨论】:
-
我不相信这是可能的,因为它需要 n/2 交换
-
不,不可能
-
目标只是反转字符串吗?有一个更简单的方法。
-
为了反转某些东西,您必须主动触摸所有元素以改变它们的位置(假设我们不谈论隐式反转)。按照设计,这受
Omega(n)的约束。想出更快的东西是不可能的(就渐近复杂度而言)。 -
这是一个很好的问题,但是它需要更新,所以请这样做。如果您想让代码更快并低于 5 秒,请要求优化 Java 代码和算法本身。如果您的问题只是关于实现更好的 O(n),那么就不要谈论时间复杂度了。
标签: java string performance optimization big-o