剑指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的超入门核心知识
|
4天前
|
云安全 监控 安全
|
2天前
|
存储 机器学习/深度学习 人工智能
打破硬件壁垒!煎饺App:强悍AI语音工具,为何是豆包AI手机平替?
直接上干货!3000 字以上长文,细节拉满,把核心功能、使用技巧和实测结论全给大家摆明白,读完你就知道这款 “安卓机通用 AI 语音工具"——煎饺App它为何能打破硬件壁垒?它接下来,咱们就深度拆解煎饺 App—— 先给大家扒清楚它的使用逻辑,附上“操作演示”和“🚀快速上手不踩坑 : 4 条核心操作干货(必看)”,跟着走零基础也能快速上手;后续再用真实实测数据,正面硬刚煎饺 App的语音助手口令效果——创建京东「牛奶自动下单神器」口令 ,从修改口令、识别准确率到场景实用性,逐一测试不掺水,最后,再和豆包 AI 手机语音助手的普通版——豆包App对比测试下,简单地谈谈煎饺App的能力边界在哪?
|
9天前
|
机器学习/深度学习 人工智能 自然语言处理
Z-Image:冲击体验上限的下一代图像生成模型
通义实验室推出全新文生图模型Z-Image,以6B参数实现“快、稳、轻、准”突破。Turbo版本仅需8步亚秒级生成,支持16GB显存设备,中英双语理解与文字渲染尤为出色,真实感和美学表现媲美国际顶尖模型,被誉为“最值得关注的开源生图模型之一”。
1164 7
|
11天前
|
机器学习/深度学习 人工智能 数据可视化
1秒生图!6B参数如何“以小博大”生成超真实图像?
Z-Image是6B参数开源图像生成模型,仅需16GB显存即可生成媲美百亿级模型的超真实图像,支持中英双语文本渲染与智能编辑,登顶Hugging Face趋势榜,首日下载破50万。
734 42
|
15天前
|
人工智能 Java API
Java 正式进入 Agentic AI 时代:Spring AI Alibaba 1.1 发布背后的技术演进
Spring AI Alibaba 1.1 正式发布,提供极简方式构建企业级AI智能体。基于ReactAgent核心,支持多智能体协作、上下文工程与生产级管控,助力开发者快速打造可靠、可扩展的智能应用。
1176 41
|
15天前
|
人工智能 前端开发 算法
大厂CIO独家分享:AI如何重塑开发者未来十年
在 AI 时代,若你还在紧盯代码量、执着于全栈工程师的招聘,或者仅凭技术贡献率来评判价值,执着于业务提效的比例而忽略产研价值,你很可能已经被所谓的“常识”困住了脚步。
942 78
大厂CIO独家分享:AI如何重塑开发者未来十年
|
3天前
|
人工智能 安全 前端开发
AgentScope Java v1.0 发布,让 Java 开发者轻松构建企业级 Agentic 应用
AgentScope 重磅发布 Java 版本,拥抱企业开发主流技术栈。
|
2天前
|
人工智能 JSON 前端开发
为什么你的API文档总是被吐槽?用这份"契约指令"终结前后端战争
本文针对前后端协作中"文档过时、不准确"的痛点,提供了一套实战验证的AI指令。通过强制结构化输入和自检机制,让AI自动生成包含完整参数、JSON示例和多语言代码的标准API契约文档,彻底解决接口沟通难题。
173 112