C/C++实现字符串按单词反转 单个单词反转逻辑求助
题目要求
实现字符串按单词反转功能:将给定字符串的最后一个单词移到首位,倒数第二个单词移到第二位,以此类推,单个单词内部字符顺序保持不变。
- 输入格式:单行输入字符串
- 输出格式:单行输出按单词反转后的字符串
- 约束条件:0 ≤ |S| ≤ 10^7,其中|S|代表字符串S的长度
- 样例输入1:
Welcome to Coding Ninjas,对应输出1:Ninjas Coding to Welcome - 样例输入2:
Always indent your code,对应输出2:code your indent Always
现有代码问题
你已经完成了整串完全反转的逻辑,但单个单词反转部分存在多处错误:
- 变量
a未初始化,作为单词反转的左边界值是随机的,完全无法正常工作 - 单词边界判断逻辑错误:当前逻辑只在遇到空格时标记结束位置,没有记录单词起始位置,也没有处理字符串末尾的最后一个单词
- 单词反转的内层循环没有移动左右指针,运行时会直接陷入死循环
- 处理单词后没有更新遍历索引,会重复扫描同一段内容
正确实现思路
你选用的两步反转法是该问题的最优实现,时间复杂度O(n)、空间复杂度O(1),完全适配10^7长度的性能约束,只需要补全单词反转的正确逻辑即可:
- 完成整串反转后,从字符串头部开始遍历
- 先跳过连续空格,定位到当前单词的起始下标
- 继续向后遍历直到遇到空格或者字符串结束符,定位到当前单词的结束下标
- 反转当前单词区间内的字符,重复上述流程直到遍历完整个字符串
修正后的完整可运行代码如下:
void reverseStringWordWise(char input[]) { // 计算字符串长度 int len = 0; for(; input[len] != '\0'; len++); if(len <= 1) return; // 空串或单字符直接返回,无需处理 // 第一步:反转整个字符串 int i = 0, j = len - 1; while(i < j) { char temp = input[i]; input[i] = input[j]; input[j] = temp; i++; j--; } // 第二步:逐个反转每个单词 int k = 0; while(k < len) { // 跳过空格,找到单词起始位置 while(k < len && input[k] == ' ') k++; int wordStart = k; // 找到单词结束位置(遇到空格或字符串结尾即停止) while(k < len && input[k] != ' ') k++; int wordEnd = k - 1; // 反转当前单词 while(wordStart < wordEnd) { char temp = input[wordStart]; input[wordStart] = input[wordEnd]; input[wordEnd] = temp; wordStart++; wordEnd--; } } }
内容的提问来源于stack exchange,提问作者Dhruv Kuchhal
相关产品推荐
相关产品推荐

