LeetCode第20题有效括号代码在不同IDE运行结果不一致问题咨询
问题描述
我编写的LeetCode第20题「有效的括号」Python代码,在PyCharm和Replit中运行能得到正确结果,但在LeetCode平台上无法通过测试,甚至返回相反结果,请问这是什么原因?以下是我使用的代码:
class Solution: def isValid(self, s: str) -> bool: s2=sorted(s) s1 = str(s2)[1:-1] count = 0 extcount=0 for i in range (len(s1)): if s1[i] == '(': count += 1.3 elif s1[i] == '[': count += 2.7 elif s1[i]=='{': count += 3.1 elif s1[i] == ')': count -= 1.3 elif s1[i] == ']': count -= 2.7 elif s1[i]== '}': count -= 3.1 else: pass if count==0: extcount+=1 x=bool(extcount) print(x) else: print (bool(extcount))
原因分析
1. 核心逻辑完全不符合题目要求
「有效的括号」要求括号嵌套顺序正确,比如([)]这种括号数量相等但顺序错误的情况是无效的,但你的代码通过排序字符串把所有左括号、右括号分别堆在一起,再用数值加减判断是否归零——这种逻辑只能判断括号数量是否相等,完全不考虑顺序,本质就是错误解法。本地测试时你可能只试了顺序正确的简单例子,没覆盖到顺序错误的测试用例,才误以为正确。
2. 误解LeetCode平台的提交规则
LeetCode要求函数返回布尔值,但你的代码全程用print输出结果,没有任何return语句。函数默认会返回None,而None在布尔判断中等价于False,这就导致平台获取的结果和你本地打印的结果完全相反:比如你本地打印True,但平台拿到None判定为False,自然通不过测试。
3. 字符串处理引入额外错误
你把排序后的列表转成字符串s1 = str(s2)[1:-1],会把列表的格式字符(逗号、空格、单引号)都包含进来。比如原字符串"()[]{}"排序后是['(', ')', '[', ']', '{', '}'],转成字符串后是"['(', ')', '[', ']', '{', '}']",截取[1:-1]后得到的是"'(', ')', '[', ']', '{', '}'",遍历的时候会处理到逗号、空格这些无关字符,虽然加了else pass,但这会导致你实际处理的不是原字符串的括号字符,本地测试没暴露问题,但平台测试用例会触发错误。
4. 浮点数精度隐患
你用1.3、2.7这类浮点数做加减运算,而浮点数在计算机中是近似存储的,多次运算后可能出现类似0.0000000001或-0.0000000001的结果,这时候count==0的判断会失败,导致结果错误。
修正方向
- 改用栈结构实现标准解法:遇到左括号入栈,遇到右括号则检查栈顶是否为对应的左括号,匹配则出栈,不匹配直接返回
False;遍历结束后检查栈是否为空,为空则返回True,否则返回False。 - 函数必须通过
return返回布尔值,不能用print输出。 - 去掉排序和错误的字符串处理逻辑。
内容的提问来源于stack exchange,提问作者Iliketrees

