如何筛选3位数中各位和为指定值且无重复排列的唯一组合
解决方案
方案1:优化循环逻辑(最优,无需额外校验)
核心思路:直接通过约束三个数字的大小关系,从根源上避免生成重复的排列组合,仅生成升序的唯一数字组,同时天然满足三位互不相等的条件,还能大幅减少循环次数。
target = 17 i = 1 ' 外层循环控制百位,取值1-9 Do While i < 10 ' 中层循环控制十位,必须大于百位,避免重复组合 j = i + 1 Do While j < 10 ' 内层循环控制个位,必须大于十位 k = j + 1 Do While k < 10 If i + j + k = target Then ' 直接添加,无需判断重复、无需判断三位不等 lsNumbers.Add(i & j & k) End If k += 1 Loop j += 1 Loop i += 1 Loop
原逻辑总循环次数为999=729次,优化后仅需循环84次,不会生成任何重复排列的结果,完全符合需求。
方案2:保留原逻辑,新增排列重复校验
如果不想修改原有循环结构,可以新增缓存集合存储已出现的数字排序结果,每次添加前做校验:
target = 17 i = 1 j = 1 k = 1 ' 新增缓存集合,存储已出现的排序后数字串 Dim existedCombs As New Collection Do While i < 10 Do While j < 10 Do While k < 10 r = i + j + k If r = target Then If i <> j And j <> k And k <> i Then ' 对三位数字排序,生成唯一组合标识 Dim digits() As Integer = {i, j, k} Array.Sort(digits) Dim combKey As String = digits(0) & digits(1) & digits(2) ' 校验该组合是否已存在 Dim exists As Boolean = False For Each item In existedCombs If item = combKey Then exists = True Exit For End If Next If Not exists Then existedCombs.Add(combKey) lsNumbers.Add(i & j & k) End If End If End If k += 1 Loop If k = 10 Then k = 1 j += 1 Loop If j = 10 Then j = 1 i += 1 Loop
内容的提问来源于stack exchange,提问作者Philip McGeehan
相关产品推荐
相关产品推荐

