iter_position_reverse测试用例不通过及无结果输出问题排查
问题排查与修复:iter_position_reverse与iterrative_insertion函数异常
问题概述
iter_position_reverse函数测试用例无法通过,执行后无法输出预期验证结果("We did it."或"It did not work for {R}"),核心原因是两个函数存在逻辑错误,导致重构后的字符串无法还原原输入。
1. iterrative_insertion函数的Bug与修复
原代码问题
offset + len(S)仅做数值计算,未将结果赋值给offset,导致偏移量始终为0,插入位置完全错误。
修复后的代码
def iterrative_insertion(S, positions): R = S offset = 0 for pos in positions: R = R[:pos + offset] + S + R[pos + offset:] offset += len(S) # 修复:将计算结果赋值给offset,更新偏移量 return R # Example usage S = "abcdabd" positions = [0, 1, 16] result = iterrative_insertion(S, positions) expected = 'aabcdabdbcdabdababcdabdcdabd' print(expected) print(result) print(result == expected) print(len(result), len(S), len(expected))
2. iter_position_reverse函数的Bug与修复
原代码问题
- 匹配逻辑错误:错误匹配原字符串
R的开头,而非当前构建的S的开头 - 匹配后未正确跳转:找到匹配后仅移动一个字符,导致重复将
S的字符添加到S中,破坏初始字符串的提取逻辑
修复后的代码
import iterrative_insertion def iter_position_reverse(R): S = "" positions = [] i = 0 n = len(R) while i < n: j = 0 # 修复:匹配当前已构建的S的开头,而非原字符串R的开头 while j < len(S) and i + j < n and S[j] == R[i + j]: j += 1 # 完全匹配S时,记录位置并跳过整个S的长度 if j == len(S) and len(S) > 0: # 避免S为空时误记录位置 positions.append(i) i += len(S) else: # 不匹配则添加当前字符到S,移动一个位置 S += R[i] i += 1 return S, positions # Test cases test_strings = [ "abcdabdaabcdabdbcdabdabcdabd", "aabcdabdbcdabdabcdabdabcdabd", "aababababcdabdcdabdcabcdabddabdcdabdbcdabd", "aaaaaaababababcdabdcdabdcabcdabddabdcdabdbcdabdababababcdabdcdabdcabcdabddabdcdabdbcdabdababababcdabdcdabdcabcdabddabdcdabdbcdabdbabababcdabdcdabdcabcdabddabdcdabdbcdabdababababcdabdcdabdcabcdabddabdcdabdbcdabd", "ddodoremefasolasiremefasolasioremdoredoremefasolasimefasolasiefasolasi", "abdaabcdabdbcdabdb" ] for R in test_strings: S, positions = iter_position_reverse(R) print("Input String:", R) print("S:", S) print("Positions:", positions) print() reconstructed = iterrative_insertion.iterrative_insertion(S, positions) if reconstructed == R: print("We did it.") else: print(f"It did not work for {R}")
修复说明
- iterrative_insertion:修正偏移量更新逻辑,确保每次插入后偏移量正确累加,保证后续插入位置的准确性
- iter_position_reverse:
- 调整匹配逻辑,改为匹配当前构建的
S,符合算法“提取初始字符串+记录插入位置”的设计意图 - 找到完整匹配时直接跳过整个
S的长度,避免重复添加字符到S中,确保S为原初始字符串,同时正确记录所有插入位置
- 调整匹配逻辑,改为匹配当前构建的
内容的提问来源于stack exchange,提问作者SJ Brigante
相关产品推荐
相关产品推荐

