剑指offer之把字符串里面空格替换成百分之20[时间复杂度是O(n)]

简介: 剑指offer之把字符串里面空格替换成百分之20[时间复杂度是O(n)]

1 问题

把字符串里面空格替换成20%

要求:时间复杂度是O(n)


2 思路

比如我们字符串ab cd ef,我们先计算出新字符串需要的长度,我们分别搞2个指针指向老的和新的字符串的尾巴,然后老字符串从'\0'开始拷贝数据到新的字符串尾巴,同时两个指针同时左移,如果老的字符串遇到了空格,那么老的字符串指针往左边移动一格,然后新的字符串指针依然向左移动并且填充'0' 、'2'、 '%',直到老的字符串指针到最左边或者老的字符串指针和新的字符串指针相等就不循环了


3 代码实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h> 
int insert(char *a, int len, char *replace, int replaceLen)
{
  //先得到多少个空格
  char *p = a;
  //先得到多少个空格
  int count = 0;
  int oldLen = 0;
  while (*p != '\0')
  {
    if (*p == ' ')
    {
      ++count;
    }
    ++p;
    ++oldLen;
  }
  //计算新的字符串长度
  int newLen = oldLen + count * (replaceLen - 1);
  printf("oldLen is %d\n", oldLen);
  printf("newLen is %d\n", newLen);
  if (newLen > len)
  {
    printf("数组的长度不够\n");
    return -1;
  }
  //循环条件也就是需要移动的数组下标最左边
  while (oldLen >= 0) //或加上while(oldLen >=0 && oldLen < newLen)
  {
    //if (*(a + oldLen) != ' ')和下面的if等价
    if (a[oldLen] != ' ')
    {
      //这里用这个和下面的等价
      /**
      *(a + newLen) = *(a + oldLen);
      newLen--;
      oldLen--;
      **/
      a[newLen--] = a[oldLen--];
    }
    else 
    {
      oldLen--;
      a[newLen--] = '0';
      a[newLen--] = '2';
      a[newLen--] = '%';
    }
  }
  return 0;
}
int main()
{
  //这里给出数组的大小长度不能小于空格替换%20后
  //新的数组的长度,我们后面的函数需要做出处理
  char a[20] ="ab cd ef";
  int len = sizeof(a);
  int result = insert(a, len, "%20", 3);
  if (result != 0)
  {
    printf("insert fail\n");
    return -1;
  }
  printf("chars is %s\n", a);
  printf("区分strlen和sizeof\n");
  char c[] = "abc";
  char d[3] = "abc";
  char e[4] = "abc";
  char *p = "abc";
  printf("sizeof(c) is %d\n", sizeof(c));
  printf("sizeof(d) is %d\n", sizeof(d));
  printf("sizeof(e) is %d\n", sizeof(e));
  printf("sizeof(p) is %d\n", sizeof(p));
  printf("strlen(c) is %d\n", strlen(c));
  printf("strlen(d) is %d\n", strlen(d));
  printf("strlen(e) is %d\n", strlen(e));
  printf("strlen(p) is %d\n", strlen(p));
  return 0; 
}

4 运行结果

oldLen is 8
newLen is 12
chars is ab%20cd%20ef
区分strlen和sizeof
sizeof(c) is 4
sizeof(d) is 3
sizeof(e) is 4
sizeof(p) is 8
strlen(c) is 3
strlen(d) is 3
strlen(e) is 3
strlen(p) is 3


相关文章
|
6月前
【错题集-编程题】最长上升子序列(二)(贪心 + 二分)
【错题集-编程题】最长上升子序列(二)(贪心 + 二分)
|
6月前
|
算法 测试技术 C#
【字符串】【贪心】【 树状数组】2193. 得到回文串的最少操作次数
【字符串】【贪心】【 树状数组】2193. 得到回文串的最少操作次数
|
6月前
|
人工智能 算法 Java
最长连续不重复子序列(蓝桥杯每日一题)
最长连续不重复子序列(蓝桥杯每日一题)
37 0
【剑指offer】-1~n整数中1出现的次数-31/67
【剑指offer】-1~n整数中1出现的次数-31/67
|
6月前
|
存储
【每日一题Day276】LC2208将数组和减半的最少操作次数 | 贪心+大顶堆
【每日一题Day276】LC2208将数组和减半的最少操作次数 | 贪心+大顶堆
43 0
|
6月前
剑指Offer LeetCode 面试题39. 数组中出现次数超过一半的数字
剑指Offer LeetCode 面试题39. 数组中出现次数超过一半的数字
32 0
|
算法
时间、空间复杂度的例题详解(上)
时间、空间复杂度的例题详解(上)
94 0
|
存储
时间、空间复杂度的例题详解(下)
时间、空间复杂度的例题详解(下)
51 0
剑指offer 44. 从1到n整数中1出现的次数
剑指offer 44. 从1到n整数中1出现的次数
71 0
|
存储
Leecode面试题43. 1~n整数中1出现的次数
Leecode面试题43. 1~n整数中1出现的次数
69 0