每日一题——反转字符串中的单词

这篇具有很好参考价值的文章主要介绍了每日一题——反转字符串中的单词。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

每日一题

反转字符串中的单词

题目链接

每日一题——反转字符串中的单词

思路(进阶)

  • 我们首先不考虑太多限制因素,先看如何实现字符串中单词的反转

    • 举个例子:我们要反转字符串“the sky is blue”中的单词,我们可以先将字符串中的每个字符反转“eht yks si eulb”,然后我们可以发现,从右到左看字符串正好就是我们想要的结果“blue is sky the”,所以再将整个字符串反转不就行了吗?
    • 而具体方法我们已经在反转整个字符串,分区域反转字符串分析清楚。
  • 接下来就是要考虑题目最恼火的限制条件:不允许多余空格的出现,即只允许单词之间出现一个空格,多余的空格须全部删除。

    • 当然,最容易想到的还是暴力解法,即碰到字符串串首空格(字符串开头就是空格)和单词之间的重复空格,就不断将字符串的元素前移,直至覆盖多余空格,但可想而知,这样做的效率不高。

    • 其实比较好的做法其实我们已经在移除元素中讲过,只不过上一次我们处理的是数组,而这一次处理的时字符串(实际上字符串也是数组)文章来源地址https://www.toymoban.com/news/detail-434584.html

      • 如果不对移除元素中的代码进行改进(如下代码),那么我们实现的就是将整个字符串中的空格删除,这显然不是我们想要的结果,我们应该让每个单词之间留有一个空格
      int slow = 0;
      for(int fast = 0; fast <= strlen(s); fast++)
      {
          if(s[fast] != ' ')
              s[slow++] = s[fast];
      }
      
      • 因此我们就要对上述代码进行改进:
      int slow = 0;
      for(int fast = 0; fast <= strlen(s); fast++)
      {
          if(s[fast] != ' ')
          {
              //只要slow不位于第一个字符(不是第一个单词),就需要手动插入空格,即确保每个单词之间有一个空格
              if(slow != 0)
                  s[slow++] = ' ';
              //如果while仍是if,那么上述插入空格的语句就会对一个单词重复执行
              //因此要用循环对每个单词进行整理
              while(s[fast] != ' ' && s[fast] != '\0')
                  s[slow++] = s[fast++];
      	}
      }
      

实现代码

void Part_reverseWords(char* s, int left, int right)	//反转指定区域的字符串
{
    while (left <= right)
    {
        char temp = s[left];
        s[left] = s[right];
        s[right] = temp;
        left++;
        right--;
    }
}
void ReplaceSpaces(char *s)		//删除多余空格
{
   int slow = 0;
    for(int fast = 0; fast < strlen(s); fast++)
    {
        if(s[fast] != ' ')
        {
            //只要slow不位于第一个字符(不是第一个单词),就需要手动插入空格,即确保每个单词之间有一个空格
            if(slow != 0)
                s[slow++] = ' ';
            //如果while仍是if,那么上述插入空格的语句就会对一个单词重复执行
            //因此要用循环对每个单词进行整理
            while(s[fast] != ' ' && s[fast] != '\0')
                s[slow++] = s[fast++];
        }
    }
    s[slow ] = '\0';	//在新的字符串末尾添加结束符
}
char* reverseWords(char* s) {
    ReplaceSpaces(s);
    int i = 0;
    //对每个单词进行反转
    for (int j = i + 1; j <= strlen(s); j++)
    {
        if (s[j] == ' ' || j == strlen(s))
        {
            Part_reverseWords(s, i, j - 1);
            i = j + 1;
        }
    }
    //对整个字符串反转
    Part_reverseWords(s,0,strlen(s) - 1);
    return s;
}

到了这里,关于每日一题——反转字符串中的单词的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包