C#伪二进制转换代码功能异常求助:数字字符串转0/1字符串逻辑实现问题
问题排查与修复
嘿,我帮你找出这段C#代码里的几个关键问题,咱们一步步拆解:
1. 循环完全没执行!
你写的for循环初始条件和判断逻辑根本不对:
for (int i = digitsArray.Length; i < digitsArray.Length; i++)
i一开始就等于数组的长度,而循环要求i < digitsArray.Length——这就导致循环体一次都不会运行,最后直接返回空字符串,这是最核心的问题。
2. 数字顺序搞反了
就算循环能跑,你通过%10和/10取数字的方式,得到的是原字符串的逆序数字。比如输入"12345",你会先拿到5,再拿到4,最后拿到1,拼接出来的结果完全是倒过来的。
3. 漏掉了等于5的情况
题目要求大于等于5替换成'1',但你的判断是if (currentDigit > 5),等于5的数字不会被替换成1,不符合需求。
4. 存在整数溢出风险
用int.Parse(number)把字符串转成int,如果输入的数字太长(比如超过10位,int最大值是2147483647),会直接抛出溢出异常,完全没必要做这个转换。
修正后的代码
其实根本不需要把字符串转成整数,直接遍历每个字符就好,既安全又高效:
static string FakeBinary(string number) { // 用StringBuilder比直接拼接字符串性能更好,尤其是长字符串 StringBuilder output = new StringBuilder(); foreach (char c in number) { // 字符转数字:利用ASCII值差,'0'的ASCII是48,所以c-'0'就能得到对应的数字 int digit = c - '0'; output.Append(digit >= 5 ? '1' : '0'); } return output.ToString(); }
如果你更喜欢用数组和for循环的写法,也可以这样:
static string FakeBinary(string number) { char[] resultChars = new char[number.Length]; for (int i = 0; i < number.Length; i++) { int digit = number[i] - '0'; resultChars[i] = digit >= 5 ? '1' : '0'; } return new string(resultChars); }
为什么这样改?
- 直接遍历字符:避免了整数转换的溢出问题,同时完美保留原字符串的顺序。
StringBuilder:字符串是C#里的不可变类型,每次用+=拼接都会创建新对象,用StringBuilder能大幅提升长字符串场景下的性能。- 修正判断逻辑:包含了等于5的情况,完全符合题目要求。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

