为什么
public int titleToNumber(String columnTitle) {int number = 0;
int sum = 0;
for (int i = 0; i < columnTitle.length(); i++) {
int temp = (int) (columnTitle.charAt(i) -64);
System.out.println(temp);
double sum1 = temp * Math.pow(26, columnTitle.length() - 1 - i);
System.out.println(sum1);
sum+= sum1;
}
return sum;
}
比
public static int titleToNumber(String columnTitle) {
int sum = 0;
for (int i = 0; i < columnTitle.length(); i++) {
sum = sum * 26 + (columnTitle.charAt(i) - 64);
}
return sum;
}
的效率高?
两者之间的主要差异在于他们的计算方法,但他们都用于将Excel的列标题(如"A", "Z", "AA"等)转换为对应的整数。让我们分析一下它们的性能差异。
-
第一个方法 (
titleToNumber
withMath.pow
):- 对于每个字符,你使用
Math.pow(26, columnTitle.length() - 1 - i)
来计算权重。Math.pow()
是一个相对耗时的操作,尤其是在循环中多次调用它。
- 对于每个字符,你使用
-
第二个方法:
- 你直接通过
sum = sum * 26 + (columnTitle.charAt(i) - 64);
的方式更新总和。这样做的复杂度是O(1)。
- 你直接通过
当我们比较这两个方法时:
-
对于第一个方法,你为每个字符都调用了
Math.pow()
,这增加了其时间复杂度。因此,尽管两种方法在高层面上都是O(n)的,其中n是columnTitle
的长度,但由于Math.pow()
的开销,第一个方法的实际执行时间会更长。 -
第二个方法更为直接和简洁,它避免了额外的计算开销。
因此,第二种方法的性能优于第一种方法。如果你在考虑性能,那么应该选择第二种方法。