一、题目解析
题目描述
小U正在检查某同学的选择题答案,她使用了一种特殊的方式,通过反选答案来验证正确答案的变化情况。反选答案是将学生原答案改为标准答案的相反选择,从而观察正确数量的增减趋势:
- 反选后的正确答案数增加:输出
"yes"
。 - 反选后的正确答案数不变:输出
"draw"
。 - 反选后的正确答案数减少:输出
"no"
。
分析思路
要解决这个问题,我们可以通过以下几个步骤进行分析和实现:
-
统计原始正确答案数:
- 遍历每道题,比较学生答案和标准答案,统计两者相同的数量,即为原始正确答案数。
-
统计反选后的正确答案数:
- 对于原答案正确的题目,反选后将变为错误,不计入反选正确数。
- 对于原答案错误的题目,反选后将变为正确,因此统计两者不同的数量作为反选正确答案数。
-
比较原始与反选正确答案数:
- 通过比较两者数量,得出相应的输出结果。
二、代码详解
以下是实现这一功能的Python代码:
python
def solution(n: int, s: str, t: str) -> str:
"""
根据原始答案和反选答案的比较,判断正确答案数的变化趋势。
参数:
n: int - 题目数量
s: str - 学生答案
t: str - 标准答案
返回:
str - "yes" / "draw" / "no"
"""
# 统计原始正确答案数
original_correct = 0
# 统计反选后的正确答案数
flipped_correct = 0
for i in range(n):
if s[i] == t[i]: # 原始答案正确
original_correct += 1
else: # 原始答案错误,反选后正确
flipped_correct += 1
# 比较两者数量关系
if flipped_correct > original_correct:
return 'yes' # 反选后正确答案数增加
elif flipped_correct == original_correct:
return 'draw' # 正确答案数保持不变
else:
return 'no' # 反选后正确答案数减少
测试用例:
python
if __name__ == '__main__':
# 测试用例 1
print(solution(2, "AB", "AA") == 'draw') # 原答案和反选均正确1题
# 测试用例 2
print(solution(3, "BAA", "ABB") == 'yes') # 反选后增加到2题正确
# 测试用例 3
print(solution(4, "ABAB", "BABA") == 'yes') # 反选后正确答案数增加到4
# 测试用例 4
print(solution(5, "AAAAA", "BBBBB") == 'yes') # 全部反选后增加正确数
三、知识总结
-
字符串的逐字符对比:
- 字符串是一种序列数据类型,通过索引可以逐字符操作,例如
s[i]
表示字符串的第i
个字符。
- 字符串是一种序列数据类型,通过索引可以逐字符操作,例如
-
双向统计逻辑:
- 原始正确数:统计相同字符数。
- 反选正确数:通过统计不同字符数,间接计算反选效果。
-
时间复杂度与空间复杂度:
- 单次遍历字符串即可完成统计,时间复杂度为 O(n) 。
- 无需额外数据结构,空间复杂度为 O(1) 。
-
逻辑分支的简化处理:
- 通过
if-elif-else
条件分支清晰表达逻辑结果。
- 通过
四、扩展与思考
-
多样化测试场景:
- 例如输入字符串长度较大时,测试代码的效率是否保持稳定。
- 验证反选逻辑在极端情况下(如完全正确或完全错误)是否正常工作。
-
优化空间复杂度:
- 虽然当前解法已达到常数空间复杂度,但理解无状态统计的方式,对进一步优化复杂算法有重要意义。
-
适配其他问题类型:
- 这一逻辑可以扩展至其他问题场景,如字符匹配、选项纠错等。
五、总结
通过本题,我们重点掌握了字符串逐字符操作、逻辑判断和复杂度分析等关键技能。本题的代码实现简单直观,清晰的逻辑结构为日后应对类似题目提供了参考模板。同时,通过多种测试用例的设计和代码优化,进一步巩固了编程基础与实践能力。