leetcode第3題:本地與平臺運行結果不一致,問題排查
在LeetCode第3題“無重復字符的最長子串”中,許多開發者遇到本地visual studio運行結果與平臺結果不符的情況。本文分析一個具體案例,解釋這種差異的成因。
問題描述:
提交代碼如下(存在錯誤):
import java.util.*; class Solution { public int lengthOfLongestSubstring(String s) { String temp1=""; ArrayList<String> result= new ArrayList<String>(); for(int i=0;i<s.length();i++){ boolean flag=true; for(int j=0;j<temp1.length();j++){ if(temp1.charAt(j)==s.charAt(i)){ result.add(temp1); temp1=""; flag=false; break; } } if(flag){ temp1+=String.valueOf(s.charAt(i)); } } int target=0; for(int j=0;j<result.size();j++){ int t=result.get(j).length(); if(t>target){ target=t; } } return target; } }
當輸入為空字符串””時,LeetCode平臺輸出0,而本地Visual Studio輸出1。代碼邏輯看似正確,為何出現差異?
問題分析與解答:
關鍵在于result.add(temp1);語句的缺失。循環結束后,temp1可能存儲著最后一段無重復字符的子串,但原代碼未將其添加到result列表。
因此,需要在循環結束后添加以下代碼:
result.add(temp1); // 關鍵語句,解決空字符串情況 int target=0; // ... (后續代碼不變)
添加后,即使輸入為空字符串,temp1(空字符串)也會被添加到result,后續循環正確計算target為0,與LeetCode平臺結果一致。
本地Visual Studio輸出1,可能是由于本地運行環境或調試器處理空字符串的方式不同導致的。建議仔細檢查本地環境配置及代碼執行流程。 更重要的是,這段代碼本身的算法邏輯存在缺陷,它并不能正確處理無重復字符的最長子串問題。 應該采用滑動窗口等更有效的算法來解決這個問題。
改進后的代碼 (使用滑動窗口算法):
class Solution { public int lengthOfLongestSubstring(String s) { int n = s.length(); int maxLength = 0; Map<Character, Integer> charIndexMap = new HashMap<>(); int start = 0; for (int end = 0; end < n; end++) { char c = s.charAt(end); if (charIndexMap.containsKey(c) && charIndexMap.get(c) >= start) { start = charIndexMap.get(c) + 1; } charIndexMap.put(c, end); maxLength = Math.max(maxLength, end - start + 1); } return maxLength; } }
這個改進后的代碼使用了滑動窗口算法,效率更高,并且能夠正確處理各種輸入,包括空字符串。 它避免了原代碼中復雜的字符串操作和潛在的錯誤。
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END