题目:

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

以下代码都是通过PHP代码实现。

拿到这个题目。我们第一反应就是使用内置php函数str_replace。

解法1:使用PHP内置函数

 str_replace(" ","%20",$string);

解法2:从头遍历替换

算法:时间复杂度是O(n^2).

我们不用php内置函数。然后自己通过php实现。则容易想到的是从头遍历字符串数组。然后遇到空格,就把后面的字符整体往后移动2格。把整体length加2.

如上图所示。我们逐次遍历。遇到空格。把wold 整体往后移动2格。然后替换%20. PHP代码实现如下。

 function strReplace($string){
if(empty($string)) {
return $string;
}
$length = strlen($string); //源字符串长度 //遍历字符数组
for ($i=0; $i < $length; $i++) {
if($string[$i] == ' ') {
//当前字符是空格。将后面的字符整体往后移动2格,从后往前移动。
for ($j=$length-1; $j > $i ; $j--) {
$string[$j+2] = $string[$j];
}
$string[$i] = '%';
$string[$i+1] = '2';
$string[$i+2] = '0';
//每次替换完,字符串长度加2。如果不加2 遍历到源字符串长度就是结束。目标字符串长度是大于源字符的。
$length = $length+2;
}
}
return $string; }

解法3:从后往前替换

算法时间复杂度:O(n)

我们可以尝试从后面往前替换。我们先算出最终字符串的长度。然后来从最终字符串的后面来比较。

大大减少了字符串数组移动的次数

PHP代码实现如下

 function strReplace($string){
if(empty($string)) {
return $string;
}
$length = strlen($string); //源字符串长度
$spaceLenth = 0;//空格个数
//获取空格的长度
for ($i=0; $i < $length; $i++) {
if($string[$i] == ' ') {
$spaceLenth++;
}
}
if($spaceLenth == 0) {
return $string;
}
//目标字符串的长度。一个空格替换后,目标长度加2。N个空格,则增加2*N
$totalLen = 2*$spaceLenth+$length;
$length--;
$totalLen--;
while ($length >=0 && $length < $totalLen) {
if($string[$length] == ' '){
$string[$totalLen--] = '0';
$string[$totalLen--] = '2';
$string[$totalLen--] = '%';
}else{
//移动字符串
$string[$totalLen--] = $string[$length];
}
$length--;
}
return $string;
}

思考:

当我们在查找替换一个字符的时候。可以选择逆向替换。来减少移动的次数。

【剑指Offer学习】【面试题4 : 替换空格】的更多相关文章

  1. 【剑指offer】面试题 5. 替换空格

    面试题 5. 替换空格 题目:请实现一个函数,将一个字符串中的空格替换成"%20".例如,当字符串为We Are Happy. 则经过替换之后的字符串为We%20Are%20Hap ...

  2. 《剑指offer》面试题4 替换空格 Java版

    (给一个足够长的字符数组,其中有一段字符,将' '(空格)替换成'%' '2' '0'三个字符,原字符段由'\0'结尾) 书中方法:这道题如果从头到尾扫描数组并替换,会涉及到数组的移动.如果不移动元素 ...

  3. 【剑指Offer】面试题05.替换空格

    题目 请实现一个函数,把字符串 s 中的每个空格替换成"%20". 示例 1: 输入:s = "We are happy." 输出:"We%20are ...

  4. 《剑指offer》面试题05. 替换空格

    问题描述 请实现一个函数,把字符串 s 中的每个空格替换成"%20". 示例 1: 输入:s = "We are happy." 输出:"We%20a ...

  5. 剑指offer编程题Java实现——替换空格

    题目描述 请实现一个函数,将一个字符串中的空格替换成"%20".例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. package ...

  6. 《剑指Offer》面试题5-替换空格

    题目:请实现一个函数,把字符串中的每个空格替换成"%20".例如输入"We are happy.",则输出"We%20are%20happy.&quo ...

  7. 剑指Offer(书):替换空格

    题目:请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 分析:通常来说,这样的题有两种方式 ...

  8. 剑指offer笔记面试题5----替换空格

    题目:请实现一个函数,把字符串中的每个空格替换成"20%".例如,输入"We are happy."则输出"We%20are%20happy.&quo ...

  9. 【剑指Offer学习】【全部面试题汇总】

    剑指Offer学习 剑指Offer这本书已经学习完了.从中也学习到了不少的东西,如今做一个总的文件夹.供自已和大家一起參考.学如逆水行舟.不进则退.仅仅有不断地学习才干跟上时候.跟得上技术的潮流! 全 ...

  10. 【剑指Offer学习】【所有面试题汇总】

    剑指Offer学习 剑指Offer这本书已经学习完了,从中也学习到了不少的东西,现在做一个总的目录,供自已和大家一起参考,学如逆水行舟,不进则退.只有不断地学习才能跟上时候,跟得上技术的潮流! 所有代 ...

随机推荐

  1. ssion机制详解

    ssion机制详解   ref:http://justsee.iteye.com/blog/1570652 虽然session机制在web应用程序中被采用已经很长时间了,但是仍然有很多人不清楚sess ...

  2. 定时清理tomcat日志文件

    原文链接:https://blog.csdn.net/qq_37936542/article/details/78788466 需求:最近公司服务器发现磁盘经常会被占满,查其原因是因为大量的日志文件. ...

  3. [Angular Directive] Create a Template Storage Service in Angular 2

    You need to define a <template> to be able to use it elsewhere in your app as a TemplateRef. Y ...

  4. poj 2689 Prime Distance(大区间筛素数)

    http://poj.org/problem?id=2689 题意:给出一个大区间[L,U],分别求出该区间内连续的相差最小和相差最大的素数对. 由于L<U<=2147483647,直接筛 ...

  5. [Ramda] Convert Object Methods into Composable Functions with Ramda

    In this lesson, we'll look at how we can use Ramda's invoker and constructNfunctions to take methods ...

  6. Local database deployment problems and fixtures

    /*By Jiangong SUN*/ After encountering some problems in deploying databases to local server, here ar ...

  7. HTML5移动开发实战必备知识——本地存储(1)

    本地缓存是HTML5出现的新技术,这个技术的出现使得移动web的开发成为了可能.我们都知道.要想打造一个高性能的移动应用,速度是关键.而在HTML5之前.仅仅有cookie可以存储数据,大小仅仅有4k ...

  8. 【9309】求Y=X1/3

    Time Limit: 1 second Memory Limit: 2 MB 问题描述 求Y=X1/3次方的值.X由键盘输入(x不等于0,在整型范围内).利用下列迭代公式计算: yn + 1=2/3 ...

  9. 【codeforces 782D】 Innokenty and a Football League

    [题目链接]:http://codeforces.com/contest/782 [题意] 每个队名有两种选择, 然后第一个选择队名相同的那些队只能选第二种; 让你安排队名 [题解] 首先全都选成第一 ...

  10. drawText文字绘制知识

    drawText(String text, float x, float y, Paint paint) x,y是基于文字基本线的,而不是android坐标系的左上角. 使用staticLayout进 ...