[讨论] 不同的循环性能居然不一样,有人探究过编译后的bytecode有什么区别吗?
elam
2015-09-28
最近在leetcode上看到一个题目
https://leetcode.com/problems/longest-substring-without-repeating-characters/ 难度平平 但是自己写的代码总是被一个测试用例判定超时 也就是时间复杂度超过要求了 我的实现如下 public int lengthOfLongestSubstring(String s) { if (s == null || "".equals(s)) return 0; if (s.length() == 1) return 1; int result = 0; Set<Character> temp = new HashSet<Character>(); int p = 0; int start = 0; while (p < s.length()) { char curChar = s.charAt(p); if (!temp.contains(curChar)) { temp.add(curChar); } else { // mark the longest sub string length result = Math.max(result, p - start + 1); // remove the duplicated char and chars before the duplicated char while (s.charAt(start) != curChar) { temp.remove(s.charAt(start)); start++; } // reset start and add curChar into map start = start + 1; } p++; } result = Math.max(result, p - start + 1); return result; } 别人写的就跑的过去 链接如下 https://leetcode.com/discuss/60454/simple-ac-o-n-java-solution 代码如下 public int lengthOfLongestSubstring(String s) { if (s == null || s.length() == 0) return 0; Set<Character> set = new HashSet<Character>(); int start = 0; int end = 0; int res = 1; set.add(s.charAt(0)); for (int i = 1; i < s.length(); i++) { char c = s.charAt(i); if (!set.contains(c)) { set.add(c); } else { res = Math.max(res, end - start + 1); while (s.charAt(start) != c) { set.remove(s.charAt(start)); start++; } start++; } end = i; } res = Math.max(res, end - start + 1); return res; } 可以看出仅仅是循环的方式不同 我在外层用了while 他在外层用了for 结果他比我快 我天真的以为for天然快? 然后改为外层for内层for的循环 结果还是比外层for内层while要慢 求解答 |
|
elam
2015-09-28
附上那个比较长的测试用例
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ ......上面这一组字符重复100遍 abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCD" |
相关讨论
相关资源推荐
- axis1.4 jar 类库。用于根据wsdl生成java服务端和客户端代码。sample文件夹内包含生成代码的样例和脚本。
- IDEA利用自带Axis工具和wsdl文件反向生成服务端客户端代码详细流程
- axis2支持webservice 自动生成代码客户端服务端代码插件
- axis1.4jar包以及WSDL和服务端代码互转方法
- AXIS2 1.7.3 idea wsdl 代码生成插件
- axis生成webservice服务端和客户端详细说明及实例
- axis根据服务端wsdl生成客户端工具
- axis2 生成服务端与客户端与客户端代码
- WeBService AXIS2根据wsdl文件生成接口及接口的调用
- java wsdl 服务端_根据wsdl反向生成webservice服务端(3种方法)