剑指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


相关文章
|
JSON 前端开发 JavaScript
不会webpack的前端可能是捡来的,万字总结webpack的超入门核心知识
该文章提供了Webpack的基础入门指南,涵盖安装配置、基本使用、加载器(Loaders)、插件(Plugins)的应用,以及如何通过Webpack优化前端项目的打包构建流程。
不会webpack的前端可能是捡来的,万字总结webpack的超入门核心知识
|
6天前
|
云安全 人工智能 算法
以“AI对抗AI”,阿里云验证码进入2.0时代
三层立体防护,用大模型打赢人机攻防战
1372 8
|
7天前
|
人工智能 Rust 运维
这个神器让你白嫖ClaudeOpus 4.5,Gemini 3!还能接Claude Code等任意平台
加我进AI讨论学习群,公众号右下角“联系方式”文末有老金的 开源知识库地址·全免费
|
6天前
|
机器学习/深度学习 安全 API
MAI-UI 开源:通用 GUI 智能体基座登顶 SOTA!
MAI-UI是通义实验室推出的全尺寸GUI智能体基座模型,原生集成用户交互、MCP工具调用与端云协同能力。支持跨App操作、模糊语义理解与主动提问澄清,通过大规模在线强化学习实现复杂任务自动化,在出行、办公等高频场景中表现卓越,已登顶ScreenSpot-Pro、MobileWorld等多项SOTA评测。
967 4
|
4天前
|
存储 弹性计算 应用服务中间件
2026年阿里云服务器新手租用全流程完整步骤教程(最新版)
2026年阿里云服务器新手租用全流程完整步骤教程,阿里云服务器提供自定义租用、一键租用、云市场租用和活动租用四种核心方式,适配不同配置需求、技术能力和预算场景。无论是需要精准配置的专业用户,还是追求快速部署的新手,都能找到合适的租用方案。以下是详细的适用场景和操作流程,助力高效上云。
298 148
|
4天前
|
人工智能 弹性计算 运维
2026年阿里云建站费用解读:三种方案价格明细、功能特性及选型建议
阿里云建站费用多少?2026年阿里云建站费用解读:三种方案价格明细、功能特性及选型建议。在数字化需求日益增长的当下,搭建网站成为个人展示、企业推广的重要途径。阿里云作为主流云服务提供商,针对不同技术基础与业务规模,推出 “自购服务器建站”“万小智 AI 模板建站”“云企业官网定制建站” 三种核心方案,价格从 38 元 / 年到数万元 / 年不等,覆盖从个人到中大型企业的全场景需求。本文基于今年最新官方定价与实测数据,从方案细节、价格体系、功能对比、场景适配等维度展开解析,为用户提供客观选型参考。
271 154
|
1天前
|
人工智能 前端开发 API
Google发布50页AI Agent白皮书,老金帮你提炼10个核心要点
老金分享Google最新AI Agent指南:让AI从“动嘴”到“动手”。Agent=大脑(模型)+手(工具)+协调系统,可自主完成任务。通过ReAct模式、多Agent协作与RAG等技术,实现真正自动化。入门推荐LangChain,文末附开源知识库链接。
242 117