05 替换空格

题目描述:

请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。

解题思路有:

 #判断字符串是否为空,判断length是否大于0。

 #记录空格的数量,没有空格直接返回原字符串。

1)考虑的问题:替换字符串是在原字符串上修改(A)还是新建字符串修改(B)

2)在当前字符串替换,怎么替换才更有效率

2-1 从前往后替换,后面的字符要不断往后移动,要多次移动,所以效率低下(在原字符串改动时)

2-2 从后往前,先计算需要多少空间,然后从后往前移动,则每个字符只为移动一次,这样效率更高一点。

 

测试用例:

 1)输入中包含空格(空格位于最前方,最后方,中间,有连续多个空格)

"hello world"

 2)输入中没有空格

 3)特殊输入测试(字符串是nullptr指针;字符串是空字符串

 

代码:


 A 新建字符串+从前往后复制  运行时间:3ms 占用内存:400-600k

 1 class Solution {
 2 public:
 3     void replaceSpace(char *str,int length) {
 4         //判断特殊的情况
 5         if(str==NULL||length<=0)
 6             return;
 7         int totalLength=0;
 8         vector<int> index ;
 9 
10         for (int i=0;str[i]!='\0';i++){
11             totalLength++;
12             //if(isspace(str[i]))
13             if(str[i]==' ')
14                 index.push_back(i);
15         }
16         
17         if (index.empty()) //判断是否有空格
18             return;
19         else{
20             int spaceNum = index.size();
21             char* newstr = new char [totalLength+spaceNum*2+1]; //用不用加1?
22 
23             for(int i=0,k=0;i<=totalLength;i++) // 判断的时候有等于(<=)'\0'也要拷贝
24             {
25                 if(i==index[k]){
26                     *newstr++='%';
27                     *newstr++='2';
28                     *newstr++='0';
29                     str++;
30                     k++;
31                 }
32                 else
33                     *newstr++=*str++;
34             }
35             newstr=newstr-(totalLength+spaceNum*2)-1;
36             str=str-totalLength-1;
37             for(int j=0;j<=(totalLength+spaceNum*2);j++){
38                 str[j]=newstr[j];
39             }
40         }
41     }
42 };
new array + front to back

注意:

1」主体代码line23-34执行结束后,newstr指针内存储修改后的代码。但该段代码执行后指针指向'\0'的后一位(因此要多减一个1),要根据字符串长度将指针移回原始位置。(不要忘记指针移动)

2」要修改的是str,因此将newstr的值拷贝给str,函数运行结束后,newstr的被释放(局部作用域)。

3」if (str==NULL||length<=0),使用||而不是&&。


B 原始字符串+从后往前复制(使用数组) 运行时间:5ms 占用内存:476k

 1 class Solution {
 2 public:
 3     void replaceSpace(char *str,int length) {
 4         if (str==NULL||length<=0)  //应该使用||而不是&&,因为两个中任意一个成立,均不用在判断
 5             return;
 6         int totalLen = 0,spaceNum=0;
 7         for(int i=0;str[i]!='\0';i++){
 8             totalLen++;
 9             if(str[i]==' ')
10                 spaceNum++;
11         }
12         int totalNew = totalLen +2*spaceNum;
13         //注意:c++中u取反使用!,而不是~(~1=-2,结果是true)
14         if(!spaceNum||totalNew>length) //totalNew>length(应该是大于符号)
15             return;
16         for(int k = totalLen,j=totalNew;k>=0;k--,j--){
17             if(k==j)
18                 return;
19             if(str[k]==' '){
20                 str[j]='0';
21                 str[--j]='2';
22                 str[--j]='%';
23             }
24             else{
25                 str[j]=str[k];
26             }
27         }
28     }
29 };
ori array + back to front

注意:

1」C++中,取反使用!(即int spaceNum =1; !spaceNum; 结果是0)

而~spaceNum 结果是-2(true)

2」~20=-21,规律如下:

20的原码:0001 0100

~操作:1110 1011(逐位取反)这是一个负数,负数在计算机中以补码形式存储。因此该序列是一个负数的补码

该负数的补码:1110 1011

该负数的反码:1110 1010 (减1)

该负数的原码:1001 0101(首位是符号位,-1)(0010101为21)。最后结果为-21


 C 原始字符串+从后往前复制(使用指针

 1 class Solution {
 2 public:
 3     void replaceSpace(char *str,int length) {
 4          if(str==NULL||length<=0)
 5              return ;
 6          int CountOfBlanks=0;
 7          int Originallength=0;
 8          for(int i=0;str[i]!='\0';i++)
 9              {
10              Originallength++;
11              if(str[i]==' ')
12                  ++CountOfBlanks;
13          }
14          int len =Originallength+2*CountOfBlanks;
15          if(len+1>length||!CountOfBlanks) //即:len>=length
16              return ;
17           
18          char*pStr1=str+Originallength;//复制结束符‘\0’
19          char*pStr2=str+len;
20         while(pStr1<pStr2)
21             {
22             if(*pStr1==' ')
23                 {
24                 *pStr2--='0';
25                 *pStr2--='2';
26                 *pStr2--='%';    
27             }
28             else
29              {
30                  *pStr2--=*pStr1;
31             }
32             --pStr1;
33         }
34     }
35 };
use point

1」当两个指针相等的时候,终止。(此时已经没有空格了)


 

编写代码时遇到的问题:

 1)判断字符串(char *str)是否为空:if(str==NULL)

 2)判断某个字符是否是空格(两种方法):isspace(str[i]) 或 if(str[i]==' ')

 

基础知识:

1)字符串的最后一个字符是'\0',用于判断一个字符串是否结束。

2)编写程序时,一定要考虑极端的情况,如要查找的数组是空的,字符串是空的,要赋值的对象是同一个对象等。

3)原码:一个正数,转换为二进制位就是这个正数的原码。负数的绝对值转换成二进制位然后在高位补1就是这个负数的原码

     反码:正数的反码就是原码,负数的反码等于原码除符号位以外所有的位取反

     补码:正数的补码与原码相同,负数的补码为 其原码除符号位外所有位取反(得到反码了),然后最低位加1

     即:正数的反码和补码都与原码相同。

            在计算机中,正数是直接用原码表示的,负数用补码表示!

 

仍存在的问题:

1)length是指什么?

 猜测:限定原始字符串指针str可扩展的内存空间,即记录总长度。

 

# prac 02

class Solution {
public:void replaceSpace(char *str,int length) {cout <<str<<endl;int num_sapce = 0;for(int i = 0;i<length;i++)if (str[i]==' ')num_sapce+=1;//if (num_sapce<1)//return str;int new_length = length + 2*num_sapce;char* new_str = new char[new_length];for(int old_index = length-1,new_index =new_length -1; old_index>=0;)if (str[old_index]==' '){old_index-=1;new_str[new_index--]='0';new_str[new_index--]='2';new_str[new_index--]='%';}else {new_str[new_index]=str[old_index];old_index-=1;new_index-=1;}for (int k = 0;k<new_length;k++){str[k]=new_str[k];}}
};
//题目要求:在原来的字符串上修改(即字符串首地址不变)
//因此,要把字符串在一次赋值回去,可以选择不生成新的变量,在原地址上修改。

  

转载于:https://www.cnblogs.com/GuoXinxin/p/9955330.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/278937.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

超链接禁用_在Microsoft Word 2003和2007中禁用自动超链接

超链接禁用If you can’t stand the automatic hyperlinking in Microsoft Word, you might be hard-pressed to find the right place to disable it in Office 2007, since all the settings are hidden so well compared to previous versions. 如果您无法在Microsoft Word中…

c语言如何创建虚拟串口,模拟串口的C语言源程序代码

本程序是模拟串口硬件机制写的&#xff0c;使用时可设一定时中断&#xff0c;时间间隔为1/4波特率&#xff0c;每中断一次调用一次接收函数&#xff0c; 每中断4次调用一次发送函数,不过.对单片机来说时钟并须要快.要知道9600的波特率的每个BIT的时间间隔是104us.而单片机中断一…

webjars管理静态资源

webjars用途简单解释 : 利用Servlet3协议规范中,包含在JAR文件/META-INF/resources/路径下的资源可以直接被web访问到这一原理&#xff0c;将前端静态资源打成jar包方便管理 静态资源打jar包 新建maven工程&#xff0c; 将需要打包的静态资源放入src/main/resources中 2. ma…

Windows Intellij环境下Gradle的 “Could not determine Java version from ‘9.0.1’”的解决方式...

当我导入Gradle项目初试Java spring的时候&#xff0c;遇到下面报错: Gradle complete project refresh failed Error:Could not determine java version from 9.0.1. 参考这篇 http://www.ddiinnxx.com/solving-not-determine-java-version-9-0-1-gradle-intellij-macosx/ 进行…

如何计算iPhone和Apple Watch上的步数

Khamosh PathakKhamosh PathakAccording to conventional wisdom, 10,000 steps a day equals a healthy life. No matter what your target is, though, you’ll need a reliable way to count your steps. The good news is you can do so on your iPhone or Apple Watch! 根…

在c语言中load,一道题理清Objective-C中的load和initialize

Objective-C中有两个方法比较特殊&#xff0c;他们会在Runtime时根据情况自动调用&#xff0c;下面我们简单分析一下调用时机以及使用场景~一般在iOS初中级面试时偶尔会被问到load和initialize方法&#xff0c;我出了一道题&#xff0c;估计会搞晕很多人。大家来看一下下面的程…

018.Zabbix维护时间和模板导入

一 维护时间 在某些正常业务维护期间&#xff0c;不需要进行告警&#xff0c;可添加维护时间。二 维护时间添加 2.1 维护 参数描述Name维护名称Maintenance type两种维护类型可选:With data collection - 依旧收集数据No data collection - 暂停收集数据Active since维护周期开…

本地服务器下的局域网安全吗_本地安全认证服务器

本地服务器下的局域网安全吗Today a reader had a very good question about lsass.exe is the Microsoft security management process for domain access and local security policies. Simply put it manages who logs on to your PC and/or Server. There are a few viru…

Query-digest-UI监控慢查询,以及此工具的改进版

本文主要描述基于pt-query-digest工具对慢查询日志进行监控的工具Query-digest-UI。(安装、使用、介绍以及benren提供的改进版。) 本文中描述的内容与其他网站上对Query-digest-UI的安装和使用稍有不同&#xff0c;因为本人对此工具稍做了调整。欢迎转载&#xff0c;请注明作者…

电热水器工作过程 c语言,热水器工作流程图

燃气热水器做为热水供应设备&#xff0c;被很多家庭所采用&#xff0c;然而&#xff0c;恒温作为燃气热水器的一个痛点&#xff0c;一次次被击中&#xff0c;那么到底为什么燃气热水器实现恒温这么难呢&#xff1f;我们将从原理讲起&#xff0c;带您认识真正的燃气热水器。燃气…

es6 模块化

test.js var vm"321321"; export { vm }; ------------------------------------------------------ export var name"李四"; a.vue import {vm} from /test console.log(vm); ------------------------------------------------------ console.log(name);…

linux上tail命令_如何在Linux上使用tail命令

linux上tail命令Fatmawati Achmad Zaenuri/ShutterstockFatmawati Achmad Zaenuri / ShutterstockThe Linux tail command displays data from the end of a file. It can even display updates that are added to a file in real-time. We show you how to use it. Linux tail…

初学者万年历c语言源代码,C语言万年历的源程序

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼for(j1;j<mon[i];j){cprintf("%3d ",j);/*if((firstj-1)%70)putchar(\n);*/}/*first(firstmon[i])%7;if(first0)first7;*/}}void month5_8(){for(i0;i<2;i){window(2i*w,3,29w*i,11);textbackground(5);clrscr();t…

用imageMagick的composite合并图片

composite命令可以非常方便的合并两张图片 因此用来进行图像加水印、批量增加边框等常用的变换 最简单的用法为&#xff1a; composite -gravity north src.jpg coverback.jpg des.jpg 其中src.jpg为前景图片 coverback.jpg为背景图片。 des.jpg为叠加后的结果 -gravity north …

白帽子讲web安全——认证与会话管理

在看白帽子讲web安全&#xff0c;刚好看到认证与会话管理&#xff1a;也就是我们在平常渗透测试中遇到最多的登录页面&#xff0c;也即是用户名和密码认证方式&#xff0c;这是最常见的认证方式。 了解两个概念&#xff1a;认证和授权 1&#xff09;&#xff1a;认证的目的是为…

iphone充电图_哪些iPhone具有无线充电功能?

iphone充电图Kevin Parrish凯文帕里什Wireless charging means you can re-energize your phone’s battery without a physical tether. It also prevents possible damage to your phone’s charging port. Unfortunately, not all phones support wireless charging, but we…

关联分析算法c语言实现,机器学习关联分析

AI开发平台ModelArtsModelArts是面向开发者的一站式AI开发平台&#xff0c;为机器学习与深度学习提供海量数据预处理及半自动化标注、大规模分布式Training、自动化模型生成&#xff0c;及端-边-云模型按需部署能力&#xff0c;帮助用户快速创建和部署模型&#xff0c;管理全周…

windows平台下基于QT和OpenCV搭建图像处理平台

在之前的博客中&#xff0c;已经分别比较详细地阐述了“windows平台下基于VS和OpenCV”以及“Linux平台下基于QT和OpenCV"搭建图像处理框架&#xff0c;并且生成了相应的免费视频。这篇博客的主要内容&#xff0c;就是基于最新版本的相应工具&#xff0c;在windows平台下&…

android死锁解决方案,【线程死锁】Android多线程死锁产生的原因以及如何避免

一、死锁定义1、生活中的列子两人吃饭&#xff0c;但只有一双筷子&#xff0c;2人轮流吃(同时拥有2只筷子才能吃)&#xff0c;某个时候一人拿了左筷子&#xff0c;一人拿了右筷子&#xff0c;两人同时占用一个资源&#xff0c;等待另一个资源&#xff0c;这时候甲等乙吃完并释放…

前端开发 常用用的静态服务器

1 运用anywhere 安装 &#xff1a;npm install anywhere -g想要以某个路径作为静态文件服务器的根目录分享&#xff0c;只需要在该目录下执行&#xff1a;anywhere 就会默认8000打开网页&#xff0c; 若文件不是index.html 需要输入文件名 A: anywhere -p 8000 ## 指定静态服务…