Coding Game二进制编码问题:C字符编码结果不符求助
问题分析与修复
你的代码主要存在以下几个问题,导致输出不符合预期:
1. 末尾段处理逻辑完全错误
你最后判断的是toBinary.Length - 1 == '1',这是把字符串的**最后一个索引(整数)**和字符'1'做比较,完全不符合逻辑。正确的做法是取字符串的最后一个字符toBinary[toBinary.Length - 1],同时还要用之前累计的cnt值来处理这个末尾的连续字符段,而不是默认按长度1处理。
2. 连续字符计数未重置
当遇到不同字符处理完当前段后,没有将cnt重置为1,导致后续的连续字符计数错误。
3. 多余空格与拼接逻辑混乱
直接用字符串拼接时添加了大量冗余空格,导致输出出现多个连续空格。更优雅的方式是用List<string>收集每一段编码,最后用单个空格拼接。
4. 重复的逻辑判断
你分开判断cnt == 1和cnt > 1,但实际上这两种情况的处理逻辑可以合并,只需要根据当前字符是'1'还是'0'选择前缀,再拼接对应数量的'0'即可。
修正后的代码
public void Solution() { string MESSAGE = "C"; string toBinary = ""; // 收集每一段编码,避免冗余空格 List<string> resultSegments = new List<string>(); // 将字符转换为二进制字符串,确保每个字符是7位标准ASCII长度 foreach (char c in MESSAGE) { toBinary += Convert.ToString(c, 2).PadLeft(7, '0'); } if (string.IsNullOrEmpty(toBinary)) { Console.WriteLine(""); return; } int cnt = 1; char currentChar = toBinary[0]; for (int i = 1; i < toBinary.Length; i++) { if (toBinary[i] == currentChar) { cnt++; } else { // 处理当前连续段 AddSegment(resultSegments, currentChar, cnt); // 重置计数和当前字符 currentChar = toBinary[i]; cnt = 1; } } // 处理最后一段连续字符 AddSegment(resultSegments, currentChar, cnt); // 用单个空格拼接所有段 string result = string.Join(" ", resultSegments); Console.WriteLine(result); } // 提取重复逻辑,添加编码段到列表 private void AddSegment(List<string> segments, char bit, int count) { if (bit == '1') { segments.Add("0"); segments.Add(new string('0', count)); } else { segments.Add("00"); segments.Add(new string('0', count)); } }
关键改进说明
- 二进制补位:添加
PadLeft(7, '0')确保每个字符的二进制都是7位(符合ASCII编码的标准长度,避免短字符导致的错误)。 - 用List收集编码段:避免手动拼接时的空格混乱,最后用
string.Join统一生成正确格式的字符串。 - 提取重复逻辑到方法:减少代码冗余,让逻辑更清晰。
- 正确处理末尾段:循环结束后单独处理最后一段连续字符,使用累计的
cnt值。 - 重置计数:每次切换字符时重置
cnt为1,保证计数准确。
测试单个字符C时,输出为:0 0 00 0000 0 00,符合预期;测试两个CC时,输出为:0 0 00 0000 0 000 00 0000 0 00,同样符合规则。
内容的提问来源于stack exchange,提问作者Bogdan Şandor
相关产品推荐
相关产品推荐

