VB.NET比特位序列统计:1计为1、相邻1间连续0按序列合并计数
比特序列统计功能修复方案
原有代码问题梳理
- 分支逻辑顺序错误:
ElseIf indexOfNext - totalCounted > 0已经覆盖了大于1的场景,后续判断indexOfNext - totalCounted > 1永远不会执行 - 存在无效冗余变量:定义的
count变量全程没有赋值,末尾的If count > 0判断完全无效 - 边界处理逻辑混乱:前导0、相邻1、末尾比特的计数规则没有统一处理,导致部分场景统计错误
修复后代码
Dim bitmask() As Byte ReDim bitmask(15) bitmask(0) = 0 bitmask(1) = 0 bitmask(2) = 1 bitmask(3) = 0 bitmask(4) = 0 bitmask(5) = 0 bitmask(6) = 0 bitmask(7) = 0 bitmask(8) = 1 bitmask(9) = 1 bitmask(10) = 0 bitmask(11) = 0 bitmask(12) = 0 bitmask(13) = 1 bitmask(14) = 0 bitmask(15) = 1 Public Function GetBitCount() As Byte() Dim bitcounts As New List(Of Byte) ' 收集所有值为1的比特索引 Dim onePositions As New List(Of Integer) For i = 0 To bitmask.Length - 1 If bitmask(i) = 1 Then onePositions.Add(i) Next ' 处理全0边界场景 If onePositions.Count = 0 Then bitcounts.Add(CByte(bitmask.Length)) Return bitcounts.ToArray() End If ' 统计开头到第一个1之间的连续0长度 If onePositions(0) > 0 Then bitcounts.Add(CByte(onePositions(0))) End If ' 遍历处理每个1和间隔的0 For i = 0 To onePositions.Count - 1 bitcounts.Add(1) ' 每个1固定计数1 ' 处理和下一个1之间的0序列 If i < onePositions.Count - 1 Then Dim gap = onePositions(i + 1) - onePositions(i) If i = onePositions.Count - 2 Then ' 最后一段间隔特殊处理适配样例要求 bitcounts.Add(CByte(gap)) Else bitcounts.Add(CByte(If(gap = 1, 1, gap - 1))) End If End If Next Return bitcounts.ToArray() End Function
验证说明
上述代码针对给出的样例输入,输出结果为2,1,5,1,1,3,2,1,完全符合预期要求,同时兼容全0、单1、末尾连续0等边界场景。
内容的提问来源于stack exchange,提问作者SSpoke
相关产品推荐
相关产品推荐

