求助:Hackerrank Check Strict Superset代码最后测试用例失败
问题排查与修复
核心问题分析
你的代码存在三个关键缺陷:
- 未处理长度相等的场景:当主集合
s与待检查集合a长度相同时,代码直接跳过判断。但严格超集要求s必须真包含a(即s≠a且s是a的超集),此时若s和a相等,应返回False,但你的代码会保留res=True,导致错误。 - 错误覆盖结果值:每次执行
res = s.issuperset(a)时,会直接覆盖之前的res状态。比如第一个集合不符合要求时res被设为False,但第二个集合符合时res又被改成True,最终输出错误结果。 - 严格超集判断逻辑缺失:仅通过
len(s) > len(a)加超集判断并不严谨,严格超集需要同时满足s包含a的所有元素,且s与a不相等。
修复后的代码
方案一:显式判断条件
s = set(map(int, input().split())) n = int(input()) is_strict_superset = True for _ in range(n): a = set(map(int, input().split())) # 严格超集需同时满足:s包含a所有元素,且s长度大于a if not s.issuperset(a) or len(s) <= len(a): is_strict_superset = False break # 发现不符合项,直接终止循环 print(is_strict_superset)
方案二:利用Python集合原生比较
Python集合支持直接用>判断严格超集,等价于s包含a且s≠a,代码更简洁:
s = set(map(int, input().split())) n = int(input()) is_strict_superset = True for _ in range(n): a = set(map(int, input().split())) if not (s > a): is_strict_superset = False break print(is_strict_superset)
修复逻辑说明
- 覆盖所有边界情况:无论是
s长度小于、等于还是大于a,都能通过条件判断筛选出不符合严格超集的场景。 - 避免结果被覆盖:一旦发现任意一个集合不满足要求,立即将结果设为
False并跳出循环,确保后续判断不会修改错误状态。 - 符合严格超集定义:严格遵循Hackerrank题目中对严格超集的要求——主集合必须包含待检查集合的所有元素,且两个集合不相等。
内容的提问来源于stack exchange,提问作者NK Rao
相关产品推荐
相关产品推荐

