leetcode第三题:本地与平台运行结果不一致,问题排查
在Leetcode第三题“无重复字符的最长子串”中,许多开发者遇到了当地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则输出0 Studio输出1。代码逻辑似乎是正确的。为什么会有差异?
问题分析与回答:
关键在于resulttres.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; } }
该改进代码采用滑动窗算法,效率更高,能正确处理包括空字符串在内的各种输入。 它避免了原代码中复杂的字符串操作和潜在的错误。
以上是Leetcode的第三个问题:本地和平台的运营结果不一致,问题在哪里?详情请关注图灵教育其他相关文章!
