剑指offer之把字符串里面空格替换成百分之20

简介: 剑指offer之把字符串里面空格替换成百分之20

1 问题

把字符串里面空格替换成百分之20

 

2 代码实现

第一种时间复杂的o(n * n)实现

#include <stdio.h>
#include <stdlib.h>
char* insert(char *a, int len, char *replace, int replaceLen)
{
  //先得到多少个空格
  char *p = a;
  int count = 0;
  while (*p != '\0')
  {
    if (*p == ' ')
    {
      ++count;
    }
    ++p;
  }
  //计算新的字符串长度
  int newLen = len + count * (replaceLen - 1);
  char *newP = NULL;
  newP = (char *)malloc(newLen);
  if (!newP)
  {
    printf("malloc fail\n");
  }
  //新开辟内存的指针后面操作的时候
  //我们用新的指针变量保存新开辟内存的指针
  char *new = newP;
  //尽量不要修改原始字符串的指针位置
  char *head = a;
  //尽量不要修改原始需要替换字符串的位置
  char *rep = replace;
  while(*head != '\0')
  {
    if (*head != ' ')
    {
      *new++ = *head++; 
    }
    else 
    {
      *head++;
      while (*rep != '\0')
      {
        *new++ = *rep++;
      }
      //这里要记得移动指针完了之后复原替换字符串指针
      rep = replace; 
    }
  }
        //尾巴要记得设置'\0'
        *new = '\0';
  //这里是申请了哪个内存指针就返回哪个
  //千万不要移动这个新开辟内存的指针
  //不然后面进行free(newP)就有问题
  return newP;
}
int main()
{
  char a[] ="ab cd ef";
  int len = sizeof(a);
  char *chars = insert(a, len, "%20", 3);
  printf("chars is %s\n", chars);
  free(chars);
  return 0; 
}

3 运行结果

chars is ab%20cd%20ef

4 总结

1  在函数里面,如果我们新开辟内存的指针如果要返回,我们不要移动这个指针的位置,不然到时外面得到了开辟内存移动后的指针进行free的时候,会出问题,所以我们要用个指针变量保存这个新开辟内存的指针,然后用指针变量进行操作内存数据


2 在函数里面如果参数传递的是指针,我们尽量不要移动,用个指针变量保存函数参数里面的指针,然后用指针变量进行内存数据操作


相关文章
|
8月前
|
算法
LeetCode题:581. 最短无序连续子数组,242. 有效的字母异位词,202. 快乐数
LeetCode题:581. 最短无序连续子数组,242. 有效的字母异位词,202. 快乐数
58 0
|
8月前
|
算法 Java
每日一题《剑指offer》数组篇之数组中出现次数超过一半的数字
每日一题《剑指offer》数组篇之数组中出现次数超过一半的数字
78 0
每日一题《剑指offer》数组篇之数组中出现次数超过一半的数字
|
8月前
|
人工智能 Java
每日一题《剑指offer》数组篇之连续子数组的最大和
每日一题《剑指offer》数组篇之连续子数组的最大和
65 0
每日一题《剑指offer》数组篇之连续子数组的最大和
|
8月前
|
Java
每日一题《剑指offer》数组篇之把数组排成最小的数
每日一题《剑指offer》数组篇之把数组排成最小的数
48 0
每日一题《剑指offer》数组篇之把数组排成最小的数
【剑指offer】-和为S的两个数-38/67
【剑指offer】-和为S的两个数-38/67
【剑指offer】-1~n整数中1出现的次数-31/67
【剑指offer】-1~n整数中1出现的次数-31/67
|
8月前
|
存储
【每日一题Day276】LC2208将数组和减半的最少操作次数 | 贪心+大顶堆
【每日一题Day276】LC2208将数组和减半的最少操作次数 | 贪心+大顶堆
54 0
|
8月前
剑指Offer LeetCode 面试题39. 数组中出现次数超过一半的数字
剑指Offer LeetCode 面试题39. 数组中出现次数超过一半的数字
44 0
剑指offer 44. 从1到n整数中1出现的次数
剑指offer 44. 从1到n整数中1出现的次数
77 0
|
存储 算法 Python
力扣刷题记录——190. 颠倒二进制位、191. 位1的个数、202. 快乐数
力扣刷题记录——190. 颠倒二进制位、191. 位1的个数、202. 快乐数
134 0
力扣刷题记录——190. 颠倒二进制位、191. 位1的个数、202. 快乐数