如何从存储二进制字符串的StringBuilder中移除尾随零
解决StringBuilder二进制字符串移除尾随零后反转的问题
你需要先移除StringBuilder中的尾随零,再反转得到无前置零的结果,比如原内容01111110,处理后反转要得到1111110。你的现有代码存在几个关键问题,下面分析并给出正确实现:
现有代码的问题
- 第一个while循环逻辑完全错误:初始
k = sb.length() -1,但循环内执行k++会直接导致索引越界,正确逻辑应该是找到末尾连续的0时k--;而且这段代码仅修改了k的值,没有对StringBuilder做实际的截断操作,尾随零并未被移除。 - 后续for循环中
sb.charAt(i)的i未定义,应该是k;且substring(0, ind)的索引范围错误,会丢失最后一个非0字符,同时没有将截断后的结果更新回原StringBuilder,导致反转的还是原始字符串。
正确实现步骤
- 从后往前遍历,定位最后一个非'0'字符的索引
- 截断StringBuilder到该索引位置(包含该字符),同时处理全为0的特殊情况(比如原字符串是
0000,需保留一个0) - 反转StringBuilder并转换为字符串
正确代码示例
// 示例输入:sb = new StringBuilder("01111110") int lastNonZeroIndex = -1; // 从末尾开始找最后一个非0字符的位置 for (int k = sb.length() - 1; k >= 0; k--) { if (sb.charAt(k) != '0') { lastNonZeroIndex = k; break; } } // 截断字符串:如果不全是0,就截断到最后一个非0字符的位置;全0则保留一个0 if (lastNonZeroIndex != -1) { sb.setLength(lastNonZeroIndex + 1); } else { sb.setLength(1); } // 反转并输出结果 String result = sb.reverse().toString(); System.out.println(result); // 输出:1111110
代码解释
lastNonZeroIndex初始为-1,用来标记全0的情况- 使用
sb.setLength()直接修改StringBuilder的长度,比创建新字符串更高效 - 全0场景单独处理,避免反转后得到空字符串,符合二进制数的表示逻辑
内容的提问来源于stack exchange,提问作者Sachin
相关产品推荐
相关产品推荐

