资讯专栏INFORMATION COLUMN

Problem 4:替换空格(字符串)

wenyiweb / 3425人阅读

摘要:注用替换的原因,空格在码中的序号为,用十六进制表示为。在第一个空格处,空格替换为,空格之后的字符全部右移三个位置。同理,第一次移动后,向后遍历,在第二个空格处继续将后边字符移动。因此后者应舍去,否则会不通过牛客测试。

一、题目描述

请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
注:用%20替换的原因,空格在ASCII码中的序号为32,用十六进制表示为0x20。

二、思路分析

参考剑指offer上的说明,需要考虑操作是原地(in place)操作还是新建字符串操作。以原地操作为例,首先考虑最直观的方法-从前往后依次替换。在第一个空格处,空格替换为%20,空格之后的字符全部右移三个位置。同理,第一次移动后,向后遍历,在第二个空格处继续将后边字符移动。

从算法角度分析,设输入规模为n,我们需要循环遍历字符串中空格(循环中,判断是否为空的操作执行n次),在每个空格处,进行字符移动操作,每个字符的移动又相当于一次循环。因此,总的运行效率为

$$ O(n^2) $$

直接遍历移动的方法效率太低,因此,考虑其他方法。
方法1
考虑比Sting高效的字符串操作工具-StringBuffer,同样使用之前的直接遍历的方法,但是对比发现,不需要重复移动,每次判断执行一次操作,共执行n此判断,效率为O(n)
方法2
不使用StringBuffer,参考剑指offer书上的方法,在原字符串上进行操作,利用两条指针进行数据移动的思路,具体见方法2代码。(注意倒序复制提高效率的思路)

三、Java实现

方法1源程序:

package jz_offer;

public class problem04 {
    public static String spaceReplace(String str) {
        StringBuffer newStr=new StringBuffer();
        int length=str.length();
        //特殊情况,
        if(str==null)
            return null;
        
        for(int i=0;i

(2019/2/17 增加)注:特殊情况下原条件为str==null||length==0,后者为空字符串,输出应仍为空字符。因此后者应舍去,否则OJ会不通过(牛客测试)。

方法2部分程序:

//2、使用临时字符数组
public static String spaceReplace2(String str) {
    int length=str.length();    
    int spaceCount=0;
    for(int i=0;i=0;i--) {
        if(str.charAt(i)==" ") {
            newStrArray[j]="0";
            newStrArray[j-1]="2";
            newStrArray[j-2]="%";
            j=j-3;
        }                
        else {
            newStrArray[j]=str.charAt(i);
            j--;
        }
    }
    return new String(newStrArray);
            
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/73257.html

相关文章

  • JavaScript 编程精解 中文第三版 九、正则表达式

    摘要:使用构造器时,需要将模式书写成普通的字符串,因此反斜杠的使用规则与往常相同。构造器的后四个参数小时分钟秒毫秒是可选的,如果用户没有指定这些参数,则参数的值默认为。 来源:ApacheCN『JavaScript 编程精解 中文第三版』翻译项目原文:Regular Expressions 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 部分参考了《JavaScript...

    Pluser 评论0 收藏0
  • 【剑指offer】2.替换空格

    摘要:例如,当字符串为则经过替换之后的字符串为。题目说的不太严谨能不能允许连续出现多个空格若有可能连续多个空格,用多个还是单个进行替换分三种情况解答不会出现连续多个空格直接用空格将字符串切割成数组,在用进行连接。 题目描述 请实现一个函数,将一个字符串中的每个空格替换成%20。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。 题目说的不太严...

    Leo_chen 评论0 收藏0
  • ES6 系列之模板符串

    摘要:最终的代码如下第二版假设有这样一段为了保持可读性,我希望最终输入的样式为其实就是匹配每行前面的空格,然后将其替换为空字符串。 基础用法 let message = `Hello World`; console.log(message); 如果你碰巧要在字符串中使用反撇号,你可以使用反斜杠转义: let message = `Hello ` World`; console.log(mes...

    Travis 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<