剑指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 在函数里面如果参数传递的是指针,我们尽量不要移动,用个指针变量保存函数参数里面的指针,然后用指针变量进行内存数据操作

(0)

相关推荐

  • C语言丨深入理解volatile关键字

    本篇文章是对C语言中关键字volatile的含义进行了详细的分析介绍,希望能在学习上帮助大家.   volatile是一个类型修饰符(type specifier).它是被设计用来修饰被不同线程访问和 ...

  • C语言中的匕首

    - C风格字符串 原创IT之州2021-02-06 11:44:22 不同于其他主流编程语言,C语言本身对于字符串的处理采用了独特的设计,被称为C风格的字符串,以区别于C 创立的字符串string. ...

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

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

  • 每日一题 剑指offer(替换空格)

    编程是很多偏计算机.人工智能领域必须掌握的一项技能,此编程能力在学习和工作中起着重要的作用.因此小白决定开辟一个新的板块"每日一题",通过每天一道编程题目来强化和锻炼自己的编程能力 ...

  • 剑指offer之字符串的全排列

    剑指offer之字符串的全排列

  • 剑指offer之左旋转字符串

    剑指offer之左旋转字符串

  • 【剑指Offer】数值的整数次方

    题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 保证base和exponent不同时为0 解法1 最直接的思路,计算base的 ...

  • 【剑指Offer】链表中倒数第k个结点

    题目描述 输入一个链表,输出该链表中倒数第k个结点. 解法 基本思路是使用两个辅助指针p, q,让p先走k - 1步后,p, q两个指针再一起走 这样当p指针走到链表的末尾时,q指针刚好走到的就是倒数 ...

  • 【剑指Offer】反转链表

    题目描述 输入一个链表,反转链表后,输出新链表的表头. 解法1 可以使用三个辅助指针pHead, last,next pHead记录当前节点,last记录上一个节点,next记录下一个节点 首先使用n ...

  • 剑指 Offer 14- I. 剪绳子

    我服了.动态规划杀我. 可以说一说解决动态规划的思路(只做了两三道就总结了emmm) 1.识别动态规划问题 --重叠子问题:大问题可以分为一个个子问题.和分治策略分割的子问题不同(分治问题的子问题是相 ...

  • 剑指offer

    03 数组中重复的数字 public int findRepeatNumber(int[] nums){ //排序后的数组,重复元素必然相邻 Arrays.sort(nums); //结果集 int ...