You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何提取字符串中(1,2,4)的所有有序排列组合及对应下标位置

逗号分隔字符串指定有序数字组合提取实现

需求说明

  • 输入为逗号分隔的数字字符串,仅提取属于集合{1,2,4}的数字
  • 按照1→2→4的数值从小到大顺序生成所有合法组合,若某数字无匹配值则该层级不参与组合
  • 同时输出每个组合对应数字在原字符串中的下标位置

现有问题分析

原有代码仅按遍历顺序输出所有匹配的单个数字,未按数值顺序生成配对组合,也无法输出组合对应的下标信息。

实现思路

  1. 首次遍历拆分后的字符串,分别收集1、2、4三个数字的所有出现下标,存入三个独立列表
  2. 根据列表是否为空,生成对应层级的组合:
    • 仅1有值:输出所有1的下标
    • 1、2有值:输出所有符合顺序要求的1下标和2下标的配对组合
    • 1、2、4都有值:输出所有符合顺序要求的1下标、2下标、4下标的三元配对组合
  3. 按需求格式化输出组合的数值和对应下标

注意:如果要求组合内数字按原始字符串出现顺序先后(即1出现在2前,2出现在4前),可在循环中增加下标大小判断,不需要顺序仅要求值的有序组合可删除该判断。

完整实现代码

' 拆分输入字符串
Dim strWords() As String = TextBox1.Text.Split(","c)
Dim list1 As New List(Of Integer)() ' 存储所有值为1的下标
Dim list2 As New List(Of Integer)() ' 存储所有值为2的下标
Dim list4 As New List(Of Integer)() ' 存储所有值为4的下标

' 第一步:收集所有符合要求的数字下标
For i As Integer = 0 To strWords.Length - 1
    Dim num As Integer = 0
    If Integer.TryParse(strWords(i), num) Then
        Select Case num
            Case 1 : list1.Add(i)
            Case 2 : list2.Add(i)
            Case 4 : list4.Add(i)
        End Select
    End If
Next

TextBox2.Clear()
' 第二步:生成所有组合并输出
' 存在4的情况输出三元组合
If list4.Count > 0 Then
    For Each idx1 In list1
        For Each idx2 In list2
            ' 要求2在1之后则保留该判断,不需要则删除
            If idx2 > idx1 Then
                For Each idx4 In list4
                    ' 要求4在2之后则保留该判断,不需要则删除
                    If idx4 > idx2 Then
                        ' 数值输出可自行切换为逐行输出1、2、4
                        TextBox2.AppendText("1,2,4" & vbNewLine)
                        ' 输出对应下标
                        TextBox2.AppendText($"({idx1},{idx2},{idx4})" & vbNewLine)
                    End If
                Next
            End If
        Next
    Next
Else
    ' 不存在4的情况输出二元组合
    If list2.Count > 0 Then
        For Each idx1 In list1
            For Each idx2 In list2
                ' 要求2在1之后则保留该判断,不需要则删除
                If idx2 > idx1 Then
                    ' 数值输出可自行切换为逐行输出1、2
                    TextBox2.AppendText("1,2" & vbNewLine)
                    ' 输出对应下标
                    TextBox2.AppendText($"({idx1},{idx2})" & vbNewLine)
                End If
            Next
        Next
    Else
        ' 不存在2的情况仅输出1
        For Each idx1 In list1
            TextBox2.AppendText("1" & vbNewLine)
            TextBox2.AppendText($"({idx1})" & vbNewLine)
        Next
    End If
End If

样例验证

第一个样例

输入字符串:3,7,1,2,3,5,2,3,5,6,9,6,7,5,9,3,7,9,1,5

  • 收集结果:list1=[2,18],list2=[3,6],list4=[]
  • 保留下标先后判断的情况下输出2组1,2,对应下标为(2,3)、(2,6),符合预期。

第二个样例

输入字符串:2,4,5,1,8,1,3,4,1,5,6,9,3,9,4,5,6,8,9,4

  • 收集结果:list1=[3,5,8],list2=[0],list4=[1,7,14,19]
  • 删除下标先后判断的情况下,第一个输出组合为1,2,4,对应下标(3,0,1),符合预期。

内容的提问来源于stack exchange,提问作者Angga Sillvert

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 05:15:08