题目:

请实现一个函数,把字符串中的每个空格替换成"%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. 使用Apache FtpServer搭建FTP服务器 [FlashFXP]

    <server xmlns="http://mina.apache.org/ftpserver/spring/v1" xmlns:xsi="http://www.w ...

  2. 关于MD5值加密算法

    public static string getMD5(string str)//该方法获取字符串的md5加密 通经常使用来验证数据     {         System.Security.Cry ...

  3. 数据预处理(normalize、scale)

    matlab 工具函数(三)-- normalize(归一化数据) 注:待处理的数据 X∈Rd×N,N 表示样本的个数,d 则是单个样本的维度: 1. 去均值(remove DC) X = bsxfu ...

  4. python request get

    import requests from urllib import parse # 返回response resp = requests.get("https://www.baidu.co ...

  5. freemarker中间split字符串切割

    freemarker中间split字符串切割 1.简易说明 split切割:用来依据另外一个字符串的出现将原字符串切割成字符串序列 2.举例说明 <#--freemarker中的split字符串 ...

  6. Canvas,Matrix的变换顺序

    Canvas的几何变换是倒序的,Matrix是正序. 比如先平移在旋转: canvas.rotate(); canvas.translate(); //translate先执行,rotate后执行 M ...

  7. 【20.35%】【codeforces 651D】Image Preview

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  8. WPF 开发自动开机启动程序

    原文:WPF 开发自动开机启动程序 本文告诉大家如何在 WPF 开发一个可以自动启动的程序 本文使用的自动开机启动方法是通过快捷方式放在启动文件夹的方式. 创建快捷方式 /// <summary ...

  9. PhoneGap Html5 App 横竖屏切换自动退出

    将以下内容添加到 AndroidManifest.xml 文件的 activity 标签中: android:configChanges="orientation|keyboardHidde ...

  10. 分布式事务slides

    最近看了<分布式系统概念与设计 第 5 版>的分布式事务章节,整理了一份 ppt.还有恢复部分没有收录进来,有空再整理啦. 下面是传到 deckspeaker 上的 slides 展示: ...