如何实现无递归的两数字序列交汇点求解?
问题分析与解决方案
你的递归和初始非递归代码存在几个关键问题,导致无法覆盖所有要求的场景:
- 未处理初始S₁=S₂的情况,直接生成下一项,错误跳过了合法的初始交汇点
- 同步推进两个序列的逻辑会错过交汇点:当一个序列先到达交汇点,另一个还没到的时候,同步推进会让先到的序列继续前进,永远追不上
- 用字符串转换计算各位数字和,处理极大数时效率低下
下面是覆盖所有场景的非递归实现:
改进后的非递归代码
def get_next(n): # 用数学方法计算下一项,避免字符串操作,提升大数处理效率 total = n temp = n while temp > 0: total += temp % 10 temp = temp // 10 return total def compute_join_point(s1, s2): # 处理初始相等的场景 if s1 == s2: return s1 current1 = s1 current2 = s2 # 每次只推进当前值较小的序列,避免错过交汇点 while current1 != current2: if current1 < current2: current1 = get_next(current1) else: current2 = get_next(current2) return current1
代码说明
- 初始相等场景:直接返回初始值,符合题目要求
- 序列推进逻辑:每次只移动数值较小的序列指针,确保不会跳过交汇点——当一个序列接近交汇点时,另一个会逐步追上,而不是同步前进错过
- 大数优化:用取模(
%)和整除(//)计算各位数字和,避免字符串转换的性能损耗,完美处理极大数值 - 覆盖所有场景:
- 自动处理S₁<S₂或S₁>S₂的情况
- 质数不影响序列生成逻辑,代码天然支持(质数只是初始值,后续项生成规则和普通数一致)
- 交汇点不对称的场景:比如S₁=2,S₂=7,序列分别为
2→4→8→16→23→28和7→14→19→28,代码会让current1逐步推进到28,current2也推进到28,正确返回28
测试示例
- 场景1(S₁<S₂):
compute_join_point(1, 3)→ 返回70 - 场景2(S₁=S₂):
compute_join_point(5,5)→ 返回5 - 场景3(含质数):
compute_join_point(7,10)→ 返回70 - 场景4(交汇点不对称):
compute_join_point(2,7)→ 返回28 - 场景5(极大数):
compute_join_point(999999999999, 888888888888)→ 高效计算并返回交汇点
内容的提问来源于stack exchange,提问作者Serge
相关产品推荐
相关产品推荐

