[英]Code in for-loops vs if-else statements
我试图解决这个问题: https : //leetcode.com/problems/longest-substring-without-repeating-characters/
以下代码在44毫秒内通过了所有测试。
for (int i = 0; i < s.length(); i++){
if (!mp.containsKey(s.charAt(i))){
mp.put(s.charAt(i), i);
//max = Math.max(max, i-first+1);
}
else {
if (mp.get(s.charAt(i))+1>=first){
first = mp.get(s.charAt(i))+1;
}
mp.put(s.charAt(i), i);
//max = Math.max(max, i-first+1);
}
max = Math.max(max, i-first+1);
}
但是以下代码仅在20毫秒内通过了所有测试。
for (int i = 0; i < s.length(); i++){
if (!mp.containsKey(s.charAt(i))){
mp.put(s.charAt(i), i);
max = Math.max(max, i-first+1);
}
else {
if (mp.get(s.charAt(i))+1>=first){
first = mp.get(s.charAt(i))+1;
}
mp.put(s.charAt(i), i);
max = Math.max(max, i-first+1);
}
}
为什么会有这么大的差异? 两个样本中的最大值只更改一次,但在if-else语句中更改它的效率远远高于在for循环结束时更改它的效率。 这是一个例外还是我们应该在编码时遵循这个标准?
在简化(不早期优化,请参见最大!)时,我会得到
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
Integer n = mp.get(ch):
if (n != null) {
first = Math.max(first, n + 1);
}
mp.put(ch, i);
max = Math.max(max, i - first + 1);
}
备注原始版本中i的双重放置。 如果第一个Math.max被替换为if,则代码可能更快。
对于两个原始版本来说,很难在这里加速声明,也许热点编译器看到了冗余。 管他呢。
看到一个使用mp.putIfAbsent
等的java 8版本会很不错,但这可能会让它变得更慢。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.