【发布时间】:2016-09-24 19:28:02
【问题描述】:
我试图解决这个问题: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 循环结束时更改它更有效。这是一个例外还是我们应该在编码时遵循这个标准?
【问题讨论】:
-
很难准确预测这种转换对机器代码的影响。也许它最终以不同的方式组织跳跃?可以转储汇编代码吗?
-
这是您放置代码的网站的时间吗?也许是他们的翻译延迟?您应该在具有本地 vm 和性能框架的本地系统上检查这一点
-
这两个程序的执行方式不太可能不同...您观察到的情况可能与您提交代码时服务器的繁忙程度有关。您应该在受控环境中对其进行测试。
-
是的,可能是这样,我会尽快在受控环境中进行测试。
-
我尝试使用两种不同方法执行相同字符串所花费的时间进行测试(我尝试了一些非常长的字符串)但无法获得任何有意义的结果
标签: java algorithm performance time