C#自定义单词反转函数报索引越界异常排查与无内置方法实现
原代码报错原因分析
原代码抛出IndexOutOfRangeException异常且无法实现单词反转的核心问题如下:
- 循环判断条件逻辑错误:拆分单词时使用的
while(start <= str[i - 1])完全不符合预期,str[i-1]是char类型,运行时会隐式转换为对应的ASCII数值(普通英文字母的ASCII值在97~122区间),循环会让start变量持续递增到远超字符串实际长度的数值,直接触发索引越界 - 单词存储逻辑错误:原逻辑逐字符往ArrayList添加单个字符,没有将连续非空格字符作为完整单词存储,即使不触发越界也无法拼接出正确的单词
- 末尾单词丢失:遍历逻辑仅在遇到空格时才截取前面的内容,字符串末尾的最后一个单词后没有空格,永远不会被存入集合
- 结果拼接有冗余:反向拼接时每个元素后都追加空格,最终返回的字符串末尾会多出一个无效的尾空格
纯手动实现的ReverseWords方案
以下实现全程不调用String.Split()、Array.Reverse()、String.Substring()、String.Join()等内置字符串/数组处理函数,从遍历到拼接全部手动实现:
using System; public class HelloWorld { public static string ReverseWords(string str) { // 空值边界处理 if (str == null || str.Length == 0) { return ""; } char[] resultBuffer = new char[str.Length]; int writePos = 0; // 结果缓冲区的当前写入位置 int scanPos = str.Length - 1; // 从字符串末尾开始向前扫描 while (scanPos >= 0) { // 跳过连续空格 while (scanPos >= 0 && str[scanPos] == ' ') { scanPos--; } if (scanPos < 0) { break; } // 定位当前单词的起止下标 int wordEnd = scanPos; while (scanPos >= 0 && str[scanPos] != ' ') { scanPos--; } int wordStart = scanPos + 1; // 非首个单词前补空格 if (writePos > 0) { resultBuffer[writePos] = ' '; writePos++; } // 将当前单词正序写入结果缓冲区 for (int j = wordStart; j <= wordEnd; j++) { resultBuffer[writePos] = str[j]; writePos++; } } // 仅将有效长度的字符转为字符串返回 return new string(resultBuffer, 0, writePos); } public static void Main(string[] args) { Console.WriteLine(ReverseWords("Our favorite color is Pink")); // 输出结果:Pink is color favorite Our } }
方案特性说明
- 时间复杂度为O(n),全程仅做线性扫描,无多余遍历和反转开销
- 空间复杂度为O(n),仅使用与原字符串等长的字符数组作为缓冲区,没有使用ArrayList等冗余集合结构,内存效率更高
- 自动兼容字符串首尾空格、单词间多空格的场景,返回结果不会出现多余的尾空格
- 所有拆分、反转逻辑全部手动实现,没有依赖题目要求规避的内置字符串/数组处理函数
内容的提问来源于stack exchange,提问作者Klang
相关产品推荐
相关产品推荐

