剑指Offer(二):替换空格
参考链接:
https://cuijiahua.com/blog/2017/11/basis_2.html
https://blog.csdn.net/wang454592297/article/details/79388868
题目:
请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
思路:
最简单的方法就是从头到尾遍历,但是时间复杂度为O(n^2)。
本文采用一种时间复杂度为O(n)的方法。
我们可以先遍历一次字符串,这样就可以统计出字符串空格的总数,并可以由此计算出替换之后的字符串的总长度。每替换一个空格,长度增加2,因此替换以后字符串的长度等于原来的长度加上2乘以空格数目。以"We are happy"为例,"We are happy"这个字符串的长度为14(包括结尾符号"\n"),里面有两个空格,因此替换之后字符串的长度是18。
我们从字符串的尾部开始复制和替换。首先准备两个指针,P1和P2,P1指向原始字符串的末尾,而P2指向替换之后的字符串的末尾。接下来我们向前移动指针P1,逐个把它指向的字符复制到P2指向的位置,直到碰到第一个空格为止。碰到第一个空格之后,把P1向前移动1格,在P2之前插入字符串"%20"。由于"%20"的长度为3,同时也要把P2向前移动3格。
将长度为1的空格替换为长度为3的“%20”,字符串的长度变长。
如果允许我们开辟一个新的数组来存放替换空格后的字符串,
那么这道题目就非常简单。设置两个指针分别指向新旧字符串首元素,
遍历原字符串,如果碰到空格就在新字符串上填入“%20”,
否则就复制元字符串上的内容。但是如果面试官要求
在原先的字符串上操作,并且保证原字符串有足够长的空间来存放替换后的字符串,
那么我们就得另想方法。
首先遍历原字符串,找出字符串的长度以及其中的空格数量,
根据原字符串的长度和空格的数量我们可以求出最后新字符串的长度。
设置两个指针point1和point2分别指向原字符串和新字符串的末尾位置。
(这里为什么取末尾开始遍历,而不是取起始开始遍历,是为了利用point1==point2这个判断条件)
如果point1指向内容不为空格,那么将内容赋值给point2指向的位置,
如果point1指向为空格,那么从point2开始赋值“02%”
直到point1==point2时表明字符串中的所有空格都已经替换完毕。
移动示意图:
编程实现:
C++:
class Solution {
public:void replaceSpace(char *str,int length) {if(str == NULL || length <= 0){return;}/*original_length为字符串str的实际长度*/int original_length = 0; //原始长度int number_blank = 0; //空格数int i;while(str[i++] != '\0'){ //遍历字符串++original_length; //长度+1if(str[i] == ' '){++number_blank; //遇到空格+1}}/*new_length为把空格替换成'%20'之后的长度*/int new_length = original_length + 2 * number_blank;int index_original = original_length-1; //原始字符串末尾索引值int index_new = new_length-1; //计算长度后的字符串末尾索引值/*index_original指针开始向前移动,如果遇到空格,替换成'%20',否则进行复制操作*/while(index_original >= 0 && index_new > index_original){if(str[index_original] == ' '){str[index_new--] = '0';str[index_new--] = '2';str[index_new--] = '%';}else{str[index_new--] = str[index_original];}--index_original;}}
};
Python2.7:
# -*- coding:utf-8 -*-
class Solution:# s 源字符串def replaceSpace(self, s):# write code herereturn s.replace(' ', '%20')
java:
for语句的三个表达式功能分别如下:
⑴控制变量的初始化;
⑵循环的条件;
⑶循环控制变量的更新;
for(;i;i--)这句代码,表达式1为空,即没有要初始化的变量;表达式2“i”即是循环条件,i为true则执行循环,i为false则循环结束;表达式3“i--”和通常用法相似,每次循环条件判断完之后i--,i在这句代码之外应该会有初始化,否则这里的i没有赋值,执行会有问题。
public class Solution {public String replaceSpace(StringBuffer str) {char[] originStr = str.toString().toCharArray();// 将字符串转为字符数组int spaceNum = 0;// 字符串中空格数量for (int i = 0; i < originStr.length; i++) {//从头到尾数字符串中空格的数量 if (originStr[i] == ' ') {spaceNum++;}}int newStrLength = originStr.length + 2 * spaceNum;//新的字符串长度为 原来的字符串长度加上 2倍的空格长度char[] newStr = new char[newStrLength];
//在内存中开辟出一块一方,存储新字符串长度的对象
//例如 :char[ ] subStr=new char[8] 在内存中开辟一个空间储存了八个字符的数组对象int originIndex = originStr.length - 1;int newStrIndex = newStrLength - 1;
//定义两个指针,originINdex 原来字符串尾端, newstrindex 新的字符串尾端for (; originIndex >= 0; originIndex--) {
//for 第一个空,表示没有初始化的变量,即用原来的值即可if(originStr[originIndex] != ' '){//当初始字符串指针位置不指向空格字符的时候newStr[newStrIndex--] = originStr[originIndex];//将原始字符串移走,放在新的字符串的位置}else {//否则,当指到空格指针的时候,倒着填写,即 20% newStr[newStrIndex--] = '0';newStr[newStrIndex--] = '2';newStr[newStrIndex--] = '%';}}return new String(newStr);}
}
---------------------
作者:雨破尘
来源:CSDN
原文:https://blog.csdn.net/wang454592297/article/details/79388868
版权声明:本文为博主原创文章,转载请附上博文链接!
public class Solution {public String replaceSpace(StringBuffer str) {//
//StringBuffer 是可变类,对一串字符进行操作char[] originStr = str.toString().toCharArray();// 将字符串转为字符数组int spaceNum = 0;// 字符串中空格数量for (int i = 0; i < originStr.length; i++) {if (originStr[i] == ' ') {spaceNum++;}}int newStrLength = originStr.length + 2 * spaceNum;char[] newStr = new char[newStrLength];int originIndex = originStr.length - 1;int newStrIndex = newStrLength - 1;for (; originIndex >= 0; originIndex--) {if(originStr[originIndex] != ' '){newStr[newStrIndex--] = originStr[originIndex];}else {newStr[newStrIndex--] = '0';newStr[newStrIndex--] = '2';newStr[newStrIndex--] = '%';}}return new String(newStr);}
}
---------------------
作者:雨破尘
来源:CSDN
原文:https://blog.csdn.net/wang454592297/article/details/79388868
版权声明:本文为博主原创文章,转载请附上博文链接!
python
class Solution:def replaceSpace(self, oldString):blankNumber = 0#空格的数量oldStringLen = len(oldString)#原字符串的长度#遍历原字符串,找出字符串的空格数量for i in range(oldStringLen):if oldString[i] == ' ':blankNumber += 1#计算新字符串的长度newStringLen = oldStringLen + blankNumber * 2#声明新字符串列表(因为字符串是不可改变的)newStringList = [' '] * newStringLen#设置两个指针,分别指向那个原字符串和新字符串的末尾位置point1 = oldStringLen - 1point2 = newStringLen - 1#遍历替换while point1 != point2:#如果两个指针位置不同,则表明没有替换完成if oldString[point1] != ' ':#字符不为空newStringList[point2] = oldString[point1]point1 -= 1point2 -= 1else:newStringList[point2] = '0'newStringList[point2-1] = '2'newStringList[point2-2] = '%'point1 -= 1point2 -= 3#把指针恰好相同时,之前的字符也补上if point1 > 0:for i in range(point1,-1,-1):newStringList[i] = oldString[i]#把字符串数组组合为字符串newString = ''for i in range(newStringLen):newString += str(newStringList[i])return newString#测试用例
s = Solution()
print(s.replaceSpace('We Are Happy'))
---------------------
作者:Yeoman92
来源:CSDN
原文:https://blog.csdn.net/Yeoman92/article/details/77865878
版权声明:本文为博主原创文章,转载请附上博文链接!
剑指Offer(二):替换空格相关推荐
- 代码随想录算法训练营第八天|● 344.反转字符串● 541. 反转字符串II● 剑指Offer 05.替换空格● 151.翻转字符串里的单词● 剑指Offer58-II.左旋转字符
一.344.反转字符串 力扣 思路:很简单的一个for循环双指针,left和right交换. class Solution {public void reverseString(char[] s) { ...
- 代码随想录算法训练营第八天|344.反转字符串 541. 反转字符串II 剑指Offer 05.替换空格 151.翻转字符串里的单词 剑指Offer58-II.左旋转字符串
一.344.反转字符串 题目:编写一个函数,其作用是将输入的字符串反转过来.输入字符串以字符数组 char[] 的形式给出. 不要给另外的数组分配额外的空间,你必须原地修改输入数组.使用 O(1) 的 ...
- 《LeetCode力扣练习》剑指 Offer 05. 替换空格 Java
<LeetCode力扣练习>剑指 Offer 05. 替换空格 Java 一.资源 题目: 请实现一个函数,把字符串 s 中的每个空格替换成"%20". 示例 1: 输 ...
- 剑指 Offer 05. 替换空格 简单
剑指 Offer 05. 替换空格 问题: 思路: 1. 方法(一):使用额外空间 2. 在原空间上扩展,利用双指针. 问题: 请实现一个函数,把字符串 s 中的每个空格替换成"%20&qu ...
- 力扣-图解算法数据结构-剑指 Offer 05. 替换空格
题目要求 力扣题解 代码 /*** @program: mydemo* @description: 剑指 Offer 05. 替换空格* @author: Mr.zeng* @create: 2021 ...
- 剑指 Offer 05. 替换空格(完整代码)
文章目录 剑指 Offer 05. 替换空格 1. 核心代码 2. 完整代码 总结 剑指 Offer 05. 替换空格 请实现一个函数,把字符串 s 中的每个空格替换成"%20". ...
- 字符串(一) | 剑指 Offer 58 - II. 左旋转字符串、541. 反转字符串 II、剑指 Offer 05. 替换空格、151. 反转字符串中的单词
剑指 Offer 58 - II. 左旋转字符串 把前k个字符移动到结尾 翻转前k个字符,翻转剩余字符 翻转整个字符串 class Solution { public:void reverse(str ...
- ~4.1 剑指 Offer 05. 替换空格
剑指 Offer 05. 替换空格 题目描述 思路 源代码 题目描述 思路 C++: 在 C++ 语言中, string 被设计成「可变」的类型,因此可以在不新建字符串的情况下实现原地修改. 思路: ...
- Suzy找到实习了吗Day 8 | 字符串开始啦 344. 反转字符串,541. 反转字符串 II,剑指 Offer 05. 替换空格,151. 反转字符串中的单词,左旋转字符串
这里是目录 344. 反转字符串 题目 Solution 541. 反转字符串 II 题目 Solution(v1) Solution(v2) 剑指 Offer 05. 替换空格 做题记录 151. ...
- 剑指 Offer 05. 替换空格 三种方法
剑指 Offer 05. 替换空格(点击立即答题) 请实现一个函数,把字符串 s 中的每个空格替换成"%20". 示例 1: 输入:s = "We are happy.& ...
最新文章
- 开课吧python学费-安利一个特别棒的工具给大家
- lambda dict sort
- apache kafka源码分析-Producer分析---转载
- Android中实现应用的静默安装
- Android工具里没有Android,android – AppCompat工具栏没有显示
- Scala介绍和安装
- RBF、GRNN和PNN神经网络的深入浅出
- 流程图符号以及绘制流程图方法
- Pubmedy加载时显示程序包无效的解决方案
- Using openRefine
- [ECCV2020]NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis
- mysql网游单机架设_网游单机架设直观教程终结版.doc
- matlab图片投稿,投稿时图片DPI的设置及相关心得
- 全球与中国的前50家最佳网站
- 国有建筑企业数字化转型整体解决方案
- PCB抄板最新方法及步骤
- python turtle绘制正多边形
- [文本处理] 文本综合类工具:wfr.exe
- <昆工>2019级学科竞赛进阶实训(程序设计)大作业
- 258_密码必须由6-20位英文字母或数字组成
热门文章
- 黑色的计算机英语造句,黑色英语怎么写
- 无盘服务器 显卡,我也来说说网吧配机器该用什么显卡
- django_models_外键应用
- Logical Databases逻辑数据库
- java中的递归算法_java递归算法实例分析
- java编程之拼图_java版拼图
- google paly发布app设备兼容性的识别
- Java 利用ffmpeg工具实现视频MP4转m3u8
- 笔记本电脑网络服务无法使用,打开网络共享中心,一直卡在打开界面或者插入网线后右下角为红叉
- PHP 基础代码之 16 增减变动的操作符 Increment and Decrement Operators