剑指Offer--05替换空格&&58左旋字符串

这篇具有很好参考价值的文章主要介绍了剑指Offer--05替换空格&&58左旋字符串。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


一、剑指Offer–05.替换空格

题目是这样的

剑指Offer--05替换空格&&58左旋字符串

意思是将字符串s中的空格替换为字符串"%20",如果只是替换一个字符还好,可以在原数组直接替换,但是是将空格替换为字符串,所以再在原数组上替换,原数组原内容会被覆盖,且长度大小不够,所以此时要动态开辟一个字符数组,这个数组开多大?考虑最坏的情况,也就是全为空格的情况,此时也就是原数组长度的三倍,但是开出来的数组大小只是存储的有效字符,还没有算上’\0’,所以还要多开一个空间。有人可以算数字符串s中空格字符的个数(count),然后新开数组空间大小为原数组s大小,加上count*2再加一

char* replaceSpace(char* s){
  int count = 0;
  for(int i = 0;i<strlen(s);i++)
  {
    if(s[i]==' ')
    {
      count++;
    }
  }
  
  int len = strlen(s);
  char*ret = (char*)malloc(sizeof(char)*(len+(count*2)+1));
  //char*ret = (char*)malloc(sizeof(char)*(len*3+1));可以这样写

  int j = 0;
  for(int i = 0;i<strlen(s);i++)
  {
    if(s[i] ==' ')
    {
        ret[j++] = '%';
        ret[j++] = '2';
        ret[j++] =  '0'; 
    }

    else
    {
      ret[j++] = s[i];
    }
  }
  ret[j] = '\0';//这里为何要对其数组ret数组有效字符数据的下一位赋值为字符'\0'
  //因为返回首地址,找的是'\0\结束,如果不赋值为'\0',有可能字符数组要过了很久才是'\0,这样会造成越界访问,所以要对其赋值为'\0'。
  return ret;
}

二、剑指Offer–58.左旋字符串

题目是这样的
剑指Offer--05替换空格&&58左旋字符串
其实就是给定一个变量n,将n之前的字符旋转到后面,然后将n之后的字符旋转到前面

朴素旋转
可以用最朴素的方法,先将第一个字符存下,然后依次将后面的字符往前覆盖,循环n次,但是这样时间复杂度为O(n^2)
剑指Offer--05替换空格&&58左旋字符串

char* reverseLeftWords(char* s, int n) {
    int len = strlen(s);
    int k = n % len;//当要旋转的长度大于了数组的长度,这样就会造成重复操作,
    //所以对其取模,保证最多旋转字符串长度,保证不会不会重复


    while (k--)
    {
        char tmp = s[0];
        int i = 0;
        for (i = 0; i < strlen(s) - 1; i++)
        {

            s[i] = s[i + 1];
        }
        s[i] = tmp;
    }

    return s;
}


这样时间复杂度为O(n^2),会显示超时,有些用例不能过

分区间旋转

先将0~n-1的字符逆置,然后将[n,len-1]之间的字符逆置,再最后总体逆置
剑指Offer--05替换空格&&58左旋字符串

void reserve(char* str, int left, int right)
{
    while (left < right)
    {
        char tmp = str[left];
        str[left] = str[right];
        str[right] = tmp;

        left++;
        right--;
    }
}

char* reverseLeftWords(char* s, int n) {

    int len = strlen(s);
    int k = n % len;

    reserve(s, 0, k - 1);
    reserve(s, k, len - 1);
    reserve(s, 0, len - 1);

    return s;
}

再开一个数组,将n之后的字符串赋值赋值给新数组从0开始依次赋值,然后再将0~n-1之间的字符依次尾插到新数组后面

剑指Offer--05替换空格&&58左旋字符串
只是这样需要新开一个数组,时间复杂度为O(n),空间复杂度为O(n)文章来源地址https://www.toymoban.com/news/detail-458130.html

char* reverseLeftWords(char* s, int n) {
    int len = strlen(s);
    int k = n % len;

    char* ret = (char*)malloc(sizeof(char) * len);
    int i = 0;
    int j = k;
    for (i = 0, j = k; j < len; j++, i++)
    {
        ret[i] = s[j];
    }
    int m = 0;
    while (m < k)
    {
        ret[i++] = s[m++];
    }

    for (int x = 0; x < len; x++)
    {
        s[x] = ret[x];
    }

    return s;
}


到了这里,关于剑指Offer--05替换空格&&58左旋字符串的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 替换空格&&反转字符串中的单词(LeetCode 剑指offer05 && 151)

    题目 剑指 Offer 05. 替换空格  思路 遍历,使用新的字符串来接原字符串,如为空格,则加入%20,否则加入原字符串。  不过看了题解有另一种解法,由于空格转化为%20,设计到原字符存储空间的增加,因此先计算出需要增加的空间后。再使用双指针,从后往前遍历,这里画的

    2024年02月16日
    浏览(46)
  • LeetCode:剑指 Offer 58 - II. 左旋转字符串

    🍎道阻且长,行则将至。🍓 🌻算法,不如说它是一种思考方式🍀 算法专栏: 👉🏻123 题目描述 :字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串\\\"abcdefg\\\"和数字2,该函数将返回左旋

    2024年02月02日
    浏览(48)
  • (字符串 ) 剑指 Offer 58 - II. 左旋转字符串 ——【Leetcode每日一题】

    难度:简单 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串\\\"abcdefg\\\"和数字2,该函数将返回左旋转两位得到的结果\\\"cdefgab\\\"。 示例 1: 输入: s = “abcdefg”, k = 2 输出: “cdefgab” 示例 2:

    2024年02月08日
    浏览(48)
  • 剑指 Offer 05. 替换空格

    力扣 请实现一个函数,把字符串 s 中的每个空格替换成\\\"%20\\\"。 示例 1: 输入:s = \\\"We are happy.\\\" 输出:\\\"We%20are%20happy.\\\" 限制: 0 = s 的长度 = 10000  题解: 算法流程:     初始化一个字符串,记为 res ;     遍历字符串 s 中的每个字符 s[i]:         当 s[i] 为空格时:向 re

    2024年02月15日
    浏览(64)
  • 【代码随想录 | Leetcode | 第十一天】字符串 | 反转字符串 | 反转字符串 II | 替换空格 | 反转字符串中的单词 | 左旋转字符串

    欢迎来到小K的Leetcode|代码随想录|专题化专栏,今天将为大家带来字符串~反转字符串 | 反转字符串 II | 替换空格 | 反转字符串中的单词 | 左旋转字符串的分享 ✨ ✨题目链接点这里 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。不要

    2024年02月15日
    浏览(52)
  • 力扣 [344、541、剑指offer 05.、151、剑指offer58-ll]

    双指针:自己的 双指针,左指针指向开头,右指针指向末尾。 交换两个左右指针。 左右指针向中间移动。 时间复杂度:O(n); 空间复杂度:O(1); 实现代码: 分类讨论:自己的 分类讨论: 如果剩余字符少于k个,则将剩余字符全部反转。 如果剩余字符大于或等于k个,则反

    2024年02月15日
    浏览(38)
  • 【剑指offer】替换空格

    👑专栏内容:力扣刷题 ⛪个人主页:子夜的星的主页 💕座右铭:前路未远,步履不停 剑指offer:替换空格 请实现一个函数,将一个字符串s中的每个空格替换成“%20”。 例如,当字符串为We Are Happy则经过替换之后的字符串为We%20Are%20Happy。 数据范围: 0 ≤ l e n ( s ) ≤ 1000

    2024年01月17日
    浏览(53)
  • 剑指offer面试题4 替换空格

    分析: 关于字符串的考点无非就是字符串的遍历以及关于字符串类型本身提供的方法,后者其实主要考察你对语言本身是否足够熟悉,比如java语言中String类型支持哪些方法,这个太具体了,不太符合对抽象的数据结构和算法的考察标准。因此思路还是要往提升时间或者空间

    2024年01月16日
    浏览(42)
  • 剑指 Offer —— 数组和字符串

    在一个 n * m 的二维数组中: 每一行都按照从左到右 非递减 的顺序排序 每一列都按照从上到下 非递减 的顺序排序 请完成一个高效的函数,输入这样的一个 二维数组和一个整数 ,判断 数组中是否含有该整数 。 示例: 现有矩阵 matrix 如下: 给定 target = 5 ,返回 true 。 给定

    2023年04月24日
    浏览(47)
  • 剑指 Offer 20. 表示数值的字符串

    剑指 Offer 20. 表示数值的字符串 这是题目给出的定义,我们只需要按照题目给出的定义完成函数的编写即可 数值 (按顺序)可以分成以下几个部分: 若干空格 一个 小数 或者 整数 (可选)一个 \\\'e\\\' 或 \\\'E\\\' ,后面跟着一个 整数 若干空格 小数 (按顺序)可以分成以下几个部分

    2024年02月06日
    浏览(43)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包