(剑指Offer)面试题4:替换空格

题目:

请实现一个函数,把字符串中的每个空格替换成“%20”,例如输入“We are happy”,则输出“We%20are%20happy”。

思路:

背景:

在网络编程中,如果URL参数中含有特殊字符,如空格,#等,导致服务器端无法获得正确的参数值,我们需要将这些特殊符号转换成服务器可以识别的字符。转换的规则就是在‘%’后面跟上ASCII码的两位十六进制的表示,比如空格的ASCII码是32,即十六进制的)0x20,因此空格被替换为“%20”。

方法:

1、假设可以开辟新的空间。

 创建一新字符串,并在新字符串上面做空格替换。

 时间复杂度:O(n),空间复杂度:O(n)

2、假设不能开辟新的空间,且原字符串长度足够。

  • 从头到尾扫描字符串,每遇到空格字符时做替换,将1个字符替换为3个字符,因此空格后面的字符需要后移两个字符。

  时间复杂度:O(n^2),空间复杂度:O(0)

  • 从尾向头扫描字符串,每遇到空格字符时做替换,无需后移字符。首先遍历一遍字符串,统计字符串中空格的个数,并计算替换后字符串的总长度,每替换一个空格,长度增加2.替换时,准备两个指针P1,P2分别指向原始字符串的末尾和替换后字符串的末尾,依次移动指针P1,遇到空格做替换,直至P1和P2相遇,即前面不再有空格出现。

  时间复杂度:O(n),空间复杂度:O(0)

代码:

#include <iostream>using namespace std;void ReplaceBlank(char string[],int length){if(string==NULL || length<=0)return;int originalLength=0;int numberOfBlank=0;int i=0;while(string[i]!='\0'){++originalLength;if(string[i]==' ')++numberOfBlank;++i;}int newLength=originalLength+numberOfBlank*2;if(newLength>length)return;int indexOfOriginal=originalLength;int indexOfNew=newLength;while(indexOfOriginal>=0 && indexOfNew>indexOfOriginal){if(string[indexOfOriginal]==' '){string[indexOfNew--]='0';string[indexOfNew--]='2';string[indexOfNew--]='%';}elsestring[indexOfNew--]=string[indexOfOriginal];--indexOfOriginal;}
}int main()
{char sentence[100]="We are happy!";ReplaceBlank(sentence,100);cout << sentence << endl;return 0;
}

在线测试OJ:

http://www.nowcoder.com/books/coding-interviews/4060ac7e3e404ad1a894ef3e17650423?rp=1

AC代码:

class Solution {
public:string replaceSpace(string str) {int originalLength=0;int numberOfBlank=0;int i=0;while(str[i]!='\0'){++originalLength;if(str[i]==' ')++numberOfBlank;++i;}int newLength=originalLength+numberOfBlank*2;//if(newLength>length)//	return;int indexOfOriginal=originalLength;int indexOfNew=newLength;while(indexOfOriginal>=0 && indexOfNew>indexOfOriginal){if(str[indexOfOriginal]==' '){str[indexOfNew--]='0';str[indexOfNew--]='2';str[indexOfNew--]='%';}elsestr[indexOfNew--]=str[indexOfOriginal];--indexOfOriginal;}return str;}
};

 

转载于:https://www.cnblogs.com/AndyJee/p/4623763.html

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

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

相关文章

Burpsuite爆破含CSRF-Token的程序

转载至https://www.se7ensec.cn/2018/10/21/Burpsuite%E7%88%86%E7%A0%B4%E5%90%ABCSRF-Token%E7%9A%84%E7%A8%8B%E5%BA%8F/ 3 年前发表 8 个月前更新 渗透测试 2 分钟读完 (大约273个字) 358次访问 Burpsuite爆破含CSRF-Token的程序 1. 抓包 0x01 开启burpsuite代理&#xff0…

Java Concurrency Essentials教程

课程大纲 并发一直是开发人员面临的挑战&#xff0c;编写并发程序可能非常困难。 引入并发性时&#xff0c;可能会发生很多事情&#xff0c;并且系统的复杂性会大大增加。 但是&#xff0c;编写健壮的并发程序的能力是开发人员的必备工具&#xff0c;并且可以帮助构建复杂的企…

如何玩转CSS链接(link)知识点?

CSS 链接 不同的链接可以有不同的样式。 链接样式 链接的样式,可以用任何CSS属性(如颜色,字体,背景等)。 特别的链接,可以有不同的样式,这取决于他们是什么状态。 这四个链接状态是: a:link - 正常,未访问过的链接a:visited - 用户已访问过的链接a:hover - 当用户…

IOS_月薪10k以上知识大总结

http://blog.csdn.net/sakulafly/article/details/40888143 转载于:https://www.cnblogs.com/luningning0901/p/4626749.html

adc0808的c语言编程51,51单片机驱动ADC0808电路图C51及汇编程序

这两天刚刚完成了一个用C编写的程序&#xff0c;这是我第一个用C语言编写的程序&#xff0c;并且调试成功。第一个C程序&#xff0c;值得纪念&#xff0c;也值得以后参考。本程序的功能是&#xff1a;1.ADC0808转换功能&#xff1b;2.数据16进制显示&#xff1b;3.串行通信数据…

正则表达式贪婪与非贪婪模式

正则表达式贪婪与非贪婪模式 之前做程序的时候看到过正则表达式的贪婪与非贪婪模式&#xff0c;今天用的时候就想不起来了&#xff0c;现在这里总结一下&#xff0c;以备自己以后用到注意。 1.什么是正则表达式的贪婪与非贪婪匹配 如&#xff1a;String str"abcaxc"…

使用jOOQ DSL

本文是我们学院课程的一部分&#xff0c;标题为jOOQ –类型安全的数据库查询 。 在SQL和特定关系数据库很重要的Java应用程序中&#xff0c;jOOQ是一个不错的选择。 当JPA / Hibernate抽象过多&#xff0c;JDBC过多时&#xff0c;这是一种替代方法。 它显示了一种现代的领域特…

[Noip模拟赛] Power

POWER 源程序名 POWER.??? (PAS,C,CPP) 可执行文件名 POWER.EXE 输入文件名 POWER.IN 输出文件名 POWER.OUT 多瑞卡得到了一份有趣而高薪的工作。每天早晨他必须关掉他所在村庄的街灯。所有的街灯都被设置在一条直路的同一侧。 多瑞卡每晚到早晨5点钟都在晚会上&a…

如何玩转CSS列表样式?速查!

目录 CSS 列表 列表 不同的列表项标记 作为列表项标记的图像 浏览器兼容性解决方案 列表 -简写属性

linux逆向工程反汇编,Kali Linux 逆向工程工具 Jad 教程

日期&#xff1a;2017年12月21日观看&#xff1a; 1,895 C 次用法&#xff1a;jad [option(s)] jad [选项(s)] 选项&#xff1a;-a - 生成JVM指令作为注释(注释)-af - 注释时输出完全限定的名称-b - 生成冗余大括号(大括号)-clear - 清除所有的前缀&#xff0c;包括默认的前缀-…

任意文件读取及删除漏洞

任意文件读取漏洞及危害 通过提交专门设计的输入&#xff0c;攻击者就可以在被访问的文件系统中读取或写入任意内容&#xff0c;往往能够使攻击者从服务器上获取敏感信息文件&#xff0c;正常读取的文件没有经过校验或者不严格&#xff0c;用户可以控制这个变量读取任意文件。…

restful web_RESTful Web服务可发现性,第4部分

restful web这是关于使用Spring 3.1和Spring Security 3.1和基于Java的配置来建立安全的RESTful Web Service的系列文章的第四篇 。 本文将重点介绍REST API&#xff0c;HATEOAS的可发现性以及由测试驱动的实际方案。 引入REST可发现性 API的可发现性是一个值得引起足够关注的…

微信小程序微信支付安卓手机可以,苹果手机支付失败。

问题截图: 解决办法有3种可能性,请按照对应的情况排查: 1.wx.request 无法发起网络请求,提示没有权限,域名已经配置过了,证书检测也是正确没问题的? 测试ios和安卓,假如有一方可以,一方不行,则是证书问题,请选用受认可的证书 检测地址:https://www.qcloud.co…

面试知识点总结01

1.Android 版本Bug 想必使用过 Android 5.0.1 系统的用户对内存泄露 bug 不会感到陌生&#xff0c;此缺陷不仅会导致内存占用过高&#xff0c;还会进而致使应用及其后台进程被强制关闭&#xff0c;甚至是系统界面崩溃等。 内存泄露 信息泄露 流量泄露 2.ArrayList 和LinkList的…

安装linux无驱动黑屏,ubuntu16.04安装黑屏与显卡安装笔记

本帖最后由 zhengchao666 于 2016-4-26 16:08 编辑ubuntu安装时黑屏处理问题描述&#xff1a;ubuntu使用光盘/USB安装时&#xff0c;出现"install ubuntu/ try ubuntu without installation"选择&#xff0c;但是Enter安装时&#xff0c;显示器显示没有信息&#xff…

从JS敏感信息泄露到GETSHELL

前言 小弟新手&#xff0c;大佬勿喷&#xff0c;文章有何不妥&#xff0c;还望大佬们斧正。 正文 前端时间打HW&#xff0c;拿到一个IP&#xff0c;先在FOFA上搜一下 发现这个IP现在开放了三个端口&#xff0c;分别是86&#xff0c;83&#xff0c;82对应不同的后台管理系统 …

HashMap两种遍历数据的方式

HashMap的遍历有两种方式&#xff0c;一种是entrySet的方式&#xff0c;另外一种是keySet的方式。 第一种利用entrySet的方式&#xff1a; Map map new HashMap(); Iterator iter map.entrySet().iterator(); while (iter.hasNext()) { Map.Entry entry (Map.Entry) iter.ne…

jOOQ类型安全数据库查询教程

课程大纲 SQL是用于关系数据库查询的功能强大且表达能力强的语言。 SQL已建立&#xff0c;标准化并且几乎不受其他查询语言的挑战。 但是&#xff0c;在Java生态系统中&#xff0c;自从JDBC以来&#xff0c;几乎没有采取任何相关的措施来更好地将SQL集成到Java中。 在更高级别上…

中专计算机专业学c语言吗,中专计算机专业学什么 有哪些课程

计算机原理、计算机应用基础、计算机网络基础、CAD辅助设计、三维动画设计、VBSIC语言及程序设计PHOTOSHOP、Windows、网页设计、Office办公自动化、多媒体、计算机系统安装及维护管理、计算机病毒原理防范等。计算机专业就业前景计算机专业就业前景很好。随着现代经济和科技的…

教你玩转CSS表格(table)

目录 表格边框 折叠边框 表格宽度和高度 表格文字对齐 表格填充 表格颜色 表格边框 指定CSS表格边框,使用border属性。 下面的例子指定了一个表格的Th和TD元素的黑色边框: table, th, td {border: 1px solid black;}