【问题标题】:All UNIQUE permutations所有 UNIQUE 排列
【发布时间】:2018-01-03 03:03:44
【问题描述】:

我找到了很多算法来获取一组数字中的每个数字排列。我找不到的是提供此类排列的唯一列表。

例如,数字 123 将产生:

123
132
213
231
312
321

但数字 113 应该只产生(跳过重复项):

113
131
311

如果有帮助,我将在数组中使用 8 位数字。

谢谢

【问题讨论】:

  • 请修复您的标签 - 您使用的是 VBA 还是 VB6?
  • 要么。我可以轻松地在两者之间转换。
  • 但是利用 Excel 的“删除重复项”功能的 VBA 解决方案无法在 VB6 中轻松实现,因此“我可以轻松地在两者之间进行转换”取决于至少删除 [excel-vba] 标签。
  • 好吧,够公平的。

标签: vba excel permutation


【解决方案1】:

从单元格a2向下输入数据并运行宏。

Sub UniqueNumber()
    Dim vDB, vR(), a
    Dim i As Integer, j As Integer, n As Long, z As Integer
    Dim k As Integer, p As Integer
    Dim dic As Object
    Dim s As String

    Set dic = CreateObject("Scripting.Dictionary")
    vDB = Range("a2", Range("a" & Rows.Count).End(3))
    z = UBound(vDB, 1)
    ReDim Preserve vR(1 To 3)
    For i = 1 To z: For j = 1 To z: For k = 1 To z

        If i <> j And i <> k And j <> k Then
            vR(1) = vDB(i, 1)
            vR(2) = vDB(j, 1)
            vR(3) = vDB(k, 1)
            s = Join(vR, "")
            If dic.Exists(s) Then
            Else
                n = n + 1
                dic.Add s, s
            End If
        End If
    Next k: Next j: Next i
    a = dic.Keys
    Range("d2").CurrentRegion.Offset(1).Clear
    Range("d2").Resize(n) = WorksheetFunction.Transpose(a)
End Sub

【讨论】:

  • 效果很好。我以前没有使用过字典/键,并且会仔细研究它的作用。谢谢。
  • 好的,如果您要处理较大的字符串,这不是获得排列的最佳方法,但我可以将字典方法应用于另一种排列算法以获得我想要的。
猜你喜欢
  • 2018-08-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-01
  • 2020-08-14
  • 2019-08-04
  • 2021-11-16
  • 2020-10-12
  • 1970-01-01
相关资源
最近更新 更多