一、题目描述

实现函数,把字符串中的空格替换为"%20"
例如:把字符串"We are like study.“中的空格全都替换为”%20",替换之后字符串就变为了"We%20are%20like%20study."

二、题目的由来
1.原因

在网络编程中,如果URL中有含有特殊字符,如空格、’#'等,可能就会导致服务器无法获得正确的参数值,所以需要我们把这些特殊字符进行替换,替换为服务器可以进行识别的字符

2.替换规则

把需要替换的字符改为:%xx,xx为要进行替换的字符的ASCII码的16进制表示,例如空格的ASCII码为32,用16进制表示的话为20,所以空格就被替换为"%20",字符’#‘的ASCII码为25,用16进制表示的话为23,那字符’#'就会被替换为"%23"

三、代码实现
1.思路

在替换空格时,从后向前开始进行搬移,因为把一个字符替换为了3个字符,所以数组的长度会变长,替换后数组的长度=空格的数量*2+替换之前数组的长度
给两个标记,p1标记原数组(替换之前的数组)的最后一个元素,p2标记新数组(替换之后的数组)的最后一个元素,在p1没有遇到空格之前,把p1标记的元素搬移到p2标记的位置,搬移之后,p1和p2都向前移动,当p1遇到空格后,p1向前移动一步,把p2标记的位置依次写入"%20",在写的过程中,每写一个字符,p2向前移动一步,循环这个过程,直到把所有空格替换完成

2.源代码

#include<stdio.h>
#include<stdlib.h>
//size为数组的容量
void Replace(char arr[], int size)
{if (arr == NULL || size < 0)return;int i = 0;int numBlank = 0;int originalLength = 0;//数组的实际长度int newLength = 0;//空格被替换后,数组的长度int indexOriginal = 0;//初始值为原数组的最后一个元素int indexNew = 0;//初始值为空格被替换后,数组的最后一个元素//1.遍历数组,计算数组的实际长度和数组中的空格数量while (arr[i] != '\0'){++originalLength;if (arr[i] == ' ')++numBlank;++i;}//2.替换空格newLength = originalLength + numBlank * 2;if (newLength < originalLength)return;indexNew = newLength;indexOriginal = originalLength;while (indexOriginal >= 0 && indexNew>indexOriginal){if (arr[indexOriginal] == ' '){arr[indexNew--] = '0';arr[indexNew--] = '2';arr[indexNew--] = '%';}else{arr[indexNew--] = arr[indexOriginal];}indexOriginal--;}
}
int main()
{char arr[30] = "we are like study";//char arr[30] = "wearelikestudy";//char arr[30] = "we ";//char arr[30] = "    we are";//char arr[30] = " ";int size = sizeof(arr) / sizeof(arr[0]);int i = 0;Replace(arr, size);for (; i < size; ++i){printf("%c", arr[i]);}printf("\n");system("pause");return 0;
}

运行结果:

四、时间复杂度

在整个替换的过程中,每个字符只会被搬移一次
时间复杂度为O(N)

五、本题的考察点

1.对内存覆盖的警惕(由于是把一个字符替换为3个字符,那替换的时候,就会涉及到内存覆盖)

2.逆向思维

对于这种题,大家一般第一反应都是从前往后进行替换,这种替换方式也可以完成题目的要求,但是时间复杂度会比较高,高达O(N^2),假如有N个空格,那有些字符可能在整个替换过程中,被搬移N次,所以时间复杂度为N*N
此时,如果想到从后往前进行搬移的话,那就会提高效率

3.在编程的过程中,一定要注意时间复杂度的问题

C语言实现:替换空格(替换字符串中的空格)相关推荐

  1. C语言--使用指针实现删除字符串中的空格

    本篇主要实现了在C语言使用指针实现删除字符串中的空格,详细内容见下面代码,主要利用指针遍历所得到的字符串,使用一个指针指向字符串首地址,判断其是否为空格,如果是则定义一个临时指针,并遍历之后的所有字符 ...

  2. 浅谈C语言将字符串中的空格替换成%20的几种方法(附图超级详细解答)

    文章目录 题目分析 暴力位移法 巧用数组法 高效倒放法 题目分析 将字符串中的空格替换为%20.样例: "abc defgx yz" 转换成 "abc%20defgx%2 ...

  3. php 替换 tab,PHP 删除字符串中的空格和换行符终极方法 - 文章教程

    有时我们生成的代码中,或多或少会遇到代码中或者字符串中有多余的空格.换行等其他字符,但是这些字符在浏览器里面是不显示出来,任何的换行和再多的空格,都只显示一个空格的空间,这势必对网页的优化有这极其不好 ...

  4. js替换字符串中的空格,换行符

    js替换字符串中的空格,换行符\r\n或\n替换成 转载 为了让回车换行符正确显示,需要将 \n 或 \r\n 替换成 .同样地,将空格替换存  .这里我们通过正则表达式来替换. 一.替换所有的空格. ...

  5. php中的替换函数,php字符串中替换函数是什么

    php字符串中替换函数有两种,分别是:1.substr_replace函数,用于把字符串的一部分替换为另一个字符串:2.str_replace函数,能够使用一个字符串替换字符串中的另一些字符. 本文操 ...

  6. 去除字符串中的空格(C语言)

    去除字符串中的空格(C语言) #include<stdio.h> #include<string.h> void f1(char *p,char c){int i=0,j=0; ...

  7. c语言删除字符串中的空格

    之前也看过别人写的一些代码都是用gets去输入字符串的,但是我用的是scanf,然而scanf函数用% s输入的话是不识别空格的,要用正则表达式去写. 以下附上我写的代码: //c语言删除字符串中的空 ...

  8. C语言经典100例c42 去除字符串中的空格

    /* [程序42] 去除字符串中的空格 * 题目:去除字符串的空格,如:" abc de fg". * 程序分析:参照注释. *//* 指针方式 */ #include <s ...

  9. PHP删除字符串中的空格和换行符终极方法

    问说网 > 文章教程 > 编程设计 > PHP删除字符串中的空格和换行符终极方法 字符串 换行符 文件编码 网页编码 隐藏字符 PHP删除字符串中的空格和换行符终极方法 问说网 •2 ...

最新文章

  1. 在AngularJS中读取查询参数的最简洁方法是什么?
  2. 137. Leetcode 77. 组合 (回溯算法-组合问题)
  3. 第一个cocos2d-x 项目
  4. 多线程读取大文件,尤其是对日志文件分析很有用。
  5. 【第8篇】Python爬虫实战-批量删除csdn私信记录
  6. Shell学习五-分割文件和提取文件名扩展名
  7. html5编写商城页面,HTML5+CSS3前端入门教程---从0开始通过一个商城实例手把手教你学习PC端和移动端页面开发第2章HTML基础知识...
  8. 流体力学有限元法(二)
  9. CubeMX编写风力摆控制系统[HAL库]
  10. spring html导出excel文件,Spring 导出 Excel-Fun言
  11. 美团热修复 Robust 方案接入(一)
  12. 用友NC 如何进行增补模块
  13. SpringBoot中出现‘@‘ that cannot start any token. (Do not use @ for indentation)....
  14. java毕业设计学生考勤系统Mybatis+系统+数据库+调试部署
  15. hr员工数据分析(实战)
  16. 社交电商的发展起伏有什么因素在其中影响?
  17. idea新建maven工程没有artifacts
  18. 秘密是如何被泄露的?自建文件分享神器HFS
  19. C语言程序设计编程题[一](山西大学876)
  20. 安卓 View 开发 绘制尺子

热门文章

  1. 基于阿里云物联网平台实现的简易出入监控 1
  2. 第八十二篇 机器学习(介绍)
  3. SCEA之路--10. Security
  4. c语言转义符作用,C语言转义字符实例详解
  5. 全国首单区块链理赔和蚂蚁区块链技术
  6. Clayman 游戏程序员养成计划
  7. synchronized,volite,lock接口分析以及锁的分类
  8. windows Oracle 忘记管理员用户名密码且系统认证失败
  9. Linux基础命令之pwd(3)
  10. close_wait状态的产生原因及解决