python剑指offer替换空格_迷人的算法-剑指offer面试题5:替换空格

题目:请实现一个函数,把字符串中的每个空格替换成"%20"。

例如,输入"We are happy.",则输出"We%20are%20happy."。

此题看似简单,实则坑还是比较多的。

替换字符的长度有变化,由空格‘ ’一个字符变成”%20“三个字符,这样势必会造成原字符串长度变长,这样就要考虑字符数组长度是否够用(当然java中String字符串的变更都是创建新的字符串常量,此处字符串视为字符数组。)

除了数组长度会发生变化,这其中还涉及到一个字符替换成三个字符后,原位置字符的移动问题(不移动会造成替换字符覆盖原字符问题),为避免同一字符多次移动的操作(O(n^2)),这里可以采用从后向前替换的操作(O(n))。

当然如果空间允许的情况下,重新创建一个字符串来得更快(显然这样会和offer擦肩而过...)。

taking is cheaper,show the code.

/**

* 〈面试题5:请实现一个函数,把字符串中的每个空格替换成"%20"。

* 例如,输入"We are happy.",则输出"We%20are%20happy."。〉

*

* @author caozx

* @date 2020/1/16 17:47

*/

public class Question05 {

/**

* 方式一:开辟新空间

*/

public String replaceBlank1(String s) {

if (s == null) {

return null;

}

StringBuilder stringBuilder = new StringBuilder();

// 遍历字符串, 复制每个字符, 当遇到空格时, 就增加替换字符。

for (int i = 0; i < s.length(); i++) {

char c = s.charAt(i);

if (c == ' ') {

stringBuilder.append("%20");

} else {

stringBuilder.append(c);

}

}

return stringBuilder.toString();

}

/**

* 方式二:从后往前复制

*/

public String replaceBlank2(String s) {

if (s == null) {

return null;

}

StringBuilder stringBuilder = new StringBuilder(s);

// 记录空格数

int blankNum = 0;

for (int i = 0; i < s.length(); i++) {

if (s.charAt(i) == ' ') {

blankNum++;

}

}

int sEndIndex = s.length() - 1;

int newStringEndIndex = s.length() - 1 + 2 * blankNum;

stringBuilder.setLength(newStringEndIndex + 1);

while (sEndIndex < newStringEndIndex) {

if (s.charAt(sEndIndex) == ' ') {

stringBuilder.setCharAt(newStringEndIndex--, '0');

stringBuilder.setCharAt(newStringEndIndex--, '2');

stringBuilder.setCharAt(newStringEndIndex--, '%');

} else {

stringBuilder.setCharAt(newStringEndIndex--, s.charAt(sEndIndex));

}

sEndIndex--;

}

return String.valueOf(stringBuilder);

}

}

测试:

public class Quention05Test {

public static void main(String[] args) {

String s = "helle world, my name is caozx.";

String s1 = "helleworld.";

Question05 question05 = new Question05();

System.out.println(question05.replaceBlank1(s));

System.out.println(question05.replaceBlank1(null));

System.out.println(question05.replaceBlank1(s1));

System.out.println(question05.replaceBlank2(s));

System.out.println(question05.replaceBlank2(null));

System.out.println(question05.replaceBlank2(s1));

}

}

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

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

相关文章

音频视频解决方案:GStreamer/ffmpeg/ffdshow/directshow/vfw

音频视频编程相关&#xff1a;GStreamer/ffmpeg/directshow/vfw linux和window下几种流行的音频视频编程框架作一个总结&#xff0c;防止自己迷惘&#xff0c;免于晕头转向。 一、GStreamer GStreamer is a library that allows the construction of graphs of media-handlin…

Linux 将进程放入后台执行,解决网络,ssh断开导致进程结束(nohup, setsid, , disown)...

Linux 将进程放入后台执行&#xff0c;解决网络&#xff0c;ssh断开导致进程结束&#xff08;nohup, setsid, &, disown&#xff09; 1、nohup 命令 我们知道&#xff0c;当用户注销&#xff08;logout&#xff09;或者网络断开时&#xff0c;终端会收到 HUP&#xff08;…

bzoj1927

1927: [Sdoi2010]星际竞速Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 2556 Solved: 1580[Submit][Status][Discuss] Description 10年一度的银河系赛车大赛又要开始了。作为全银河最盛大的活动之一&#xff0c;夺得这个项目的冠军无疑是很多人的梦想&#xff0c;来自杰…

python until怎么用_python基础之从认识python到python的使用

python的历史&#xff1a;python的创始人是吉多范罗苏姆(Guido van Rossum)&#xff0c;人称“龟叔”&#xff0c;1989年圣诞节期间&#xff0c;Guido开始写Python语言的编译器。他希望这个叫做Python的语言能符合他的理想&#xff1a;创造一种C和shell之间&#xff0c;功能全面…

前端之同源策略 Jsonp 与 CORS

同源策略 同源策略&#xff08;Same origin policy&#xff09;是一种约定&#xff0c;它是浏览器最核心也最基本的安全功能&#xff0c;如果缺少了同源策略&#xff0c;则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的&#xff0c;浏览器只是针对同…

vue新手入门——vue-cli搭建

首先说明&#xff0c;以下内容vue官网都有文档&#xff0c;如果觉得麻烦啰嗦&#xff0c;请移步至 安装-vue.js 。 准备工作&#xff1a; 1.下载并安装node环境&#xff0c;一般情况下安装好node之后&#xff0c;npm也会安装好。具体安装的话&#xff0c;百度大概能帮得上忙。 …

如何看懂源代码–(分析源代码方法)

我们在写程式时&#xff0c;有不少时间都是在看别人的代码。例如看小组的代码&#xff0c;看小组整合的守则&#xff0c;若一开始没规划怎么看&#xff0c; 就会“噜看噜苦&#xff08;台语&#xff09; ” 不管是参考也好&#xff0c;从开源抓下来研究也好&#xff0c;为了了解…

linux关于安装

一&#xff0e;安装gcc gcc cloog-ppl ppl(libppl.so.7/libppl_c.so.2) cpp mpfr(libmpfr.so.1) gcc-c libstdc-devel mpfr-2.4.1-6.el6.i686.rpm和ppl-0.10.2-11.el6.i686.rpm 快捷键rz sz&#xff1a; rz、sz命令没找到&#xff1f; 安装lrzsz即可&#xff1a; shell># y…

python cmath模块_cmath模块-PYTHON

这是一个float型的常数>>> cmath.e2.718281828459045>>> type(cmath.e)文档>>> import cmath>>> help(cmath)Help on module cmath:NAMEcmathFILE/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/cm…

Python 第三方模块之 pdfkit

pdfkit&#xff0c;把 HTMLCSS 格式的文件转换成 PDF 格式文档的一个工具。 其实&#xff0c;pdfkit 是 html 转成 pdf 工具包 wkhtmltopdf 的 Python 封装。所以&#xff0c;首先安装 wkhtmltopdf 。 一般情况下&#xff0c;wkhtmltopdf需要手动安装&#xff0c;网站是 https…

LNMP环境添加第三方模块

一.在LNMP环境下添加memcache模块 1.安装依赖库(libevent) [rootnode1 ~]# tar xvf libevent-2.0.21-stable.tar.gz [rootnode1 ~]# cd libevent-2.0.21-stable [rootnode1 libevent-2.0.21-stable]# ./configure --prefix/usr/local/libevent [rootnode1 libevent-2.0.21-sta…

学生成绩管理系统-程序维护

托管平台地址&#xff1a;https://gitee.com/lucess/StudentMarkManage.git 小组名称:干翻沈师 程序运行方法: 1、后台服务&#xff1a;进入项目文件夹执行 python TeamProject.py runsercer 0.0.0.0:5050 2、前台服务&#xff1a;进入./WEB-INFO/TeamProjectWeb 文件夹执行 ya…

改需求

转载于:https://www.cnblogs.com/gw2010/p/7856484.html

架构师一般做到多少岁_软件测试可以做到多大岁数?

做这个行业也几年了&#xff0c;经常听到有人问&#xff0c;软件测试这个行业能干到多少岁&#xff0c;当然里边包含想要进入这个行业的和已经在这个行业里边发展的&#xff01;基本上软件测试可以分为三条职业发展路线&#xff1a;技术路线、管理路线、产品路线&#xff01;目…

Python 第三方模块之 MySQL数据库连接模块 PyMySQL

PyMySQL的安装 pip install PyMySQL python连接数据库 import pymysqlconn pymysql.connect(hostlocalhost, userroot, password"root",databasedb, port3306, # 数字3306charsetutf8, # 不是utf-8autocommitTrue # autocommitTrue 让每次提交都去调用…

初学Spring Boot

1.Spring Boot注解 (1)SpringBootApplication开启了Spring的组件扫描和Spring Boot的自动配置,实际上&#xff0c;SpringBootApplication是将三个注解组合在了一起&#xff0c;这三个注解分别是 SpringBootConfiguration&#xff0c;ComponentScan&#xff0c;Ena…

15条常用的视频音频编辑脚本命令(mencoder/ffmpeg等)

可以把它当快速简易参考看&#xff0c;主要的功能有&#xff1a; 视频格式转换音频格式转换切割视频及音频连接两段视频视频音频同步将图像系列转换成视频 这里是百鬼丸以前收集的一部分命令行视频音频编辑脚本命令&#xff0c;一直在自己的记事本里随时用&#xff0c;现在…

python rowcount_PyQt(Python+Qt)学习随笔:QTableWidget的currentItem、rowCount、columnCount等部件状态属性访问方法...

老猿将QTableWidget表格部件中反映部件当前情况的一些方法归类为部件状态访问方法&#xff0c;包括部件的行数、列数、当前项、当前行、当前列等属性访问方法。1、行数rowCountQTableWidget的rowCount属性保存表格部件中的行数&#xff0c;在QTableWidget创建时如果没有指定行数…

Python 内置模块之 random

常用API import random# 随机小数 print(random.random()) # 大于0且小于1之间的小数。0< n<1.0 print(random.uniform(1,3)) # 大于1小于3的小数# 随机整数 print(random.randint(1,5)) # 大于等于1且小于等于5之间的整数#从指定范围内&#xff0c;按指定基…

微信jssdk遇到的一些问题汇总

1.用户手动去触发的接口可以直接调用比如wx.startRecord(); 但是写在页面加载完成里就无效&#xff0c;需要写在 wx.ready(function(){wx.startRecord(); }); 才会有效。 2.h5 的audio标签只支持ogg,mp3,wav格式的音频&#xff0c;微信jssdk录制的是amr格式的语音文件&#xf…