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

将旧值数组位掩码按值匹配规则映射到新值数组的实现问题

旧值数组bitmask按规则移位实现问题

我需要将旧值数组对应的bitmask按规则移位到新值数组的对应位置,规则为相同值第二次匹配时自动跳过。当前第一版实现仅第一个测试用例运行异常,其余用例正常,更新后的第二版代码输出仍与预期存在偏差,求正确实现方案。

原有代码与测试用例

txtUndoPlaintext.Text = Replace(txtUndoPlaintext.Text, "  ", " ")
txtUndoPlaintext.Text = txtUndoPlaintext.Text.TrimStart(CChar(" "))
txtUndoPlaintext.Text = txtUndoPlaintext.Text.TrimEnd(CChar(" "))

Dim UniqueList() As Byte = Split(txtUndoPlaintext.Text, " ").[Select](Function(n) Byte.Parse(n)).ToArray()


txtPlainText.Text = Replace(txtPlainText.Text, "  ", " ")
txtPlainText.Text = txtPlainText.Text.TrimStart(CChar(" "))
txtPlainText.Text = txtPlainText.Text.TrimEnd(CChar(" "))

Dim OriginalUniqueList() As Byte = Split(txtPlainText.Text, " ").[Select](Function(n) Byte.Parse(n)).ToArray()

txtUndoBitMask.Text = Replace(txtUndoBitMask.Text, "  ", " ")
txtUndoBitMask.Text = txtUndoBitMask.Text.TrimStart(CChar(" "))
txtUndoBitMask.Text = txtUndoBitMask.Text.TrimEnd(CChar(" "))

bitmask = Split(txtUndoBitMask.Text, " ").[Select](Function(n) Byte.Parse(n)).ToArray()

Dim newbitmask() As Byte = Nothing
Array.Resize(newbitmask, bitmask.Length)
'Array.Copy(bitmask, newbitmask, bitmask.Length)

bitmaskCounter = 0

For i = 0 To UniqueList.Length - 1
    For j = (i + 1) To OriginalUniqueList.Length - 1
        If OriginalUniqueList(i) = UniqueList(j) Then
            Exit For
        End If
    Next j

    'If OriginalUniqueList(i) = UniqueList(i) Then
    ' bitmaskCounter += 1
    ' Continue For
    ' End If

    'If OriginalUniqueList(j) = UniqueList(j) Then
    'bitmaskCounter += 1
    'Continue For
    'End If

    If (j < OriginalUniqueList.Length - 1) AndAlso newbitmask(i) = 1 AndAlso newbitmask(j) = 1 AndAlso bitmask(bitmaskCounter) = 1 Then
        newbitmask(i) = 1
        newbitmask(j) = 1
    ElseIf (j > OriginalUniqueList.Length - 1) AndAlso bitmask(bitmaskCounter) = 1 Then
        newbitmask(i) = 1
    ElseIf (j < OriginalUniqueList.Length - 1) AndAlso OriginalUniqueList(i) = UniqueList(i) Then
        newbitmask(i) = 0
    ElseIf bitmask(bitmaskCounter) = 1 Then
        newbitmask(j) = 1
    End If
    bitmaskCounter += 1
Next

错误示例

旧值数组(value before): 1 2 1 3 2 4 3 8 2 2 1 3 4 2 1 2
新值数组(value after):  1 2 4 3 1 2 3 4 3 2 1 8 2 1 2 2
旧bitmask(old): 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0
预期新bitmask(new): 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 0
匹配结果:
下标2→4 = 正常
下标3→8 = 异常 [此处逻辑出错]
下标7→11 = 正常

正常运行示例

示例1

旧值数组: 1 2 3 1 2 3 4 1 2 3 4
新值数组: 1 2 3 4 1 2 3 4 1 2 3
旧bitmask: 0 0 0 1 0 0 1 0 0 0 0 
新bitmask: 0 0 0 0 1 0 0 1 0 0 0
匹配结果:
下标3→4 = 正常
下标6→7 = 正常

示例2

旧值数组: 1 2 1 3 2 3 2 4
新值数组:  1 2 4 1 2 3 2 3
旧bitmask: 0 0 1 1 0 1 0 0 
新bitmask: 0 0 0 1 0 1 0 1
匹配结果:
下标2→3 = 正常
下标3→5 = 正常
下标5→7 = 正常

示例3

旧值数组: 1 2 1 3 2
新值数组:  1 2 1 2 3
旧bitmask: 0 0 1 1 0
新bitmask: 0 0 1 0 1
匹配结果:
下标2→2 = 正常
下标3→4 = 正常

第二版更新代码

Private Sub Button11_Click(sender As Object, e As EventArgs) Handles Button11.Click
    Dim bitmaskCounter As Integer = 0


    Dim UniqueList() As Byte = Split("1 2 1 3 2 4 3 8 2 2 1 3 4 2 1 2", " ").[Select](Function(n) Byte.Parse(n)).ToArray()
    Dim OriginalUniqueList() As Byte = Split("1 2 4 3 1 2 3 4 3 2 1 8 2 1 2 2", " ").[Select](Function(n) Byte.Parse(n)).ToArray()

    Dim TheValues = New List(Of Byte)(UniqueList)
    bitmask = Split("0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0", " ").[Select](Function(n) Byte.Parse(n)).ToArray()

    Dim newbitmask() As Byte = Nothing
    Array.Resize(newbitmask, bitmask.Length)
    'Array.Copy(bitmask, newbitmask, bitmask.Length)

    bitmaskCounter = 0
    Dim i As Integer = 0
    Dim j As Integer = 0

    Dim ignoreOldOffsets As New List(Of Short)
    Dim ignoreNewOffsets As New List(Of Short)

    Dim found As Boolean = False

    While i >= 0
        found = False
        Do While j > 0
            If j = OriginalUniqueList.Length Then Exit Do
            If OriginalUniqueList(j) = UniqueList(i) Then
                found = True
                Exit Do
            End If
            j += 1
        Loop

        If bitmaskCounter >= bitmask.Length Then Exit While

        If j = i AndAlso OriginalUniqueList(j) = UniqueList(i) OrElse j = OriginalUniqueList.Length Then
            bitmaskCounter += 1
            ignoreOldOffsets.Add(i)
            ignoreNewOffsets.Add(j)
            j = i + 1
            i += 1
            Continue While
        End If

        If ignoreOldOffsets.Contains(i) AndAlso ignoreNewOffsets.Contains(j) Then
            bitmaskCounter += 1
            j = i
            Continue While
        End If

        'If OriginalUniqueList(j) = UniqueList(j) Then
        'bitmaskCounter += 1
        'Continue For
        'End If
        'newbitmask(i) = 1
        'newbitmask(j) = 1
        'ignoreOffsets.Add(i)
        'ignoreOffsets.Add(j)

        If bitmask(i) = 1 Then
            newbitmask(i) = 1
            newbitmask(j) = 1
            ignoreOldOffsets.Add(i)
            ignoreNewOffsets.Add(j)
        End If
        bitmaskCounter += 1
        i += 1
        j = i
    End While

    'Fixed bits output to textbox.
    txtOutput.Text += "New Bits: "
    For i = 0 To newbitmask.Length - 1
        txtOutput.Text += newbitmask(i) & " "
    Next
    txtOutput.Text += vbCrLf

    'Reset bitmaskCounter.
    bitmaskCounter = 0
End Sub

第二版运行偏差

预期旧bitmask:      0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0
预期新bitmask:      0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 0
第二版实际输出:    0 0 1 0 1 0 0 1 0 0 0 1 0 0 0 0 

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 03:06:04