剑指Offer(二):替换空格
参考链接:
https://cuijiahua.com/blog/2017/11/basis_2.html
https://blog.****.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; //长度+1
if(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 here
return 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);
}
}
---------------------
作者:雨破尘
来源:****
原文:https://blog.****.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);
}
}
---------------------
作者:雨破尘
来源:****
原文:https://blog.****.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 - 1
point2 = newStringLen - 1
#遍历替换
while point1 != point2:#如果两个指针位置不同,则表明没有替换完成
if oldString[point1] != ' ':#字符不为空
newStringList[point2] = oldString[point1]
point1 -= 1
point2 -= 1
else:
newStringList[point2] = '0'
newStringList[point2-1] = '2'
newStringList[point2-2] = '%'
point1 -= 1
point2 -= 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
来源:****
原文:https://blog.****.net/Yeoman92/article/details/77865878
版权声明:本文为博主原创文章,转载请附上博文链接!