You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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长度的性能约束,只需要补全单词反转的正确逻辑即可:

  1. 完成整串反转后,从字符串头部开始遍历
  2. 先跳过连续空格,定位到当前单词的起始下标
  3. 继续向后遍历直到遇到空格或者字符串结束符,定位到当前单词的结束下标
  4. 反转当前单词区间内的字符,重复上述流程直到遍历完整个字符串

修正后的完整可运行代码如下:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 01:09:25