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

硅基生命体
• 阅读 2466

一、题目描述

请实现一个函数,将一个字符串中的每个空格替换成“%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<length;i++) {
            if(str.charAt(i)==' ') {
                newStr.append("%20");            
            }else {
                newStr.append(str.charAt(i));
            }
        }
        return newStr.toString();
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        //包含空格-:前-后-中-连续空格
        String str1 = " Wearehappy";
        String str2 = "Wearehappy ";
        String str3 = "We are happy";
        String str4 = "We   are   happy  ";
        //没有空格
        String str5="Wearehappy";
        //特殊输入测试:只有连续空格、只有一个空格、是null指针、是空字符串
        String str6="   ";
        String str7=" ";
        //String str8=null; //会出现NullPointerException(运行时异常)
        String str8="";
        
        String[] strArray=new String[] {str1,str2,str3,str4,str5,
                str6,str7,str8};
        for(int i=0;i<strArray.length;i++) {
            System.out.println(spaceReplace(strArray[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<length;i++)
        if(str.charAt(i)==' ') {
            spaceCount++;
        }
    
    int newLength=length+spaceCount*2;
    char[] newStrArray=new char[newLength];
    //特殊情况
    if(str==null)
        return null;
    int j=newLength-1;
    for(int i=length-1;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);
            
}
点赞
收藏
评论区
推荐文章
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
3年前
java string 字符串替换
i、replace方法  该方法的作用是替换字符串中所有指定的字符,然后生成一个新的字符串。经过该方法调用以后,原来的字符串不发生改变。例如:     String s  “abcat”;     String s1  s.replace(‘a’,‘1’);  该代码的作用是将字符串s中所有的字符a替换成字符1,生成
Bill78 Bill78
4年前
Python 字符串常用方法总结
明确:对字符串的操作方法都不会改变原来字符串的值1,去掉空格和特殊符号name.strip()去掉空格和换行符name.strip('xx')去掉某个字符串name.lstrip()去掉左边的空格和换行符name.rstrip()去掉右边的空格和换行符2,字符串的搜索和替换name.count('x')查找某个
Stella981 Stella981
3年前
2018最新Web前端经典面试试题及答案
javascript: JavaScript中如何检测一个变量是一个String类型?请写出函数实现typeof(obj)"string"typeofobj"string"obj.constructorString请用js去除字符串空格?
Stella981 Stella981
3年前
Nginx 伪静态Rewrite,重定向Location配置总结(转)
语法规则:location\|~|~\|^~\/uri/{…}\开头表示精确匹配^~开头表示uri以某个常规字符串开头,理解为匹配url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~/static//aa匹配到(注意是空格)。~开头表示区分大小写的正则匹配~\ 
Stella981 Stella981
3年前
JS 苹果手机日期显示NaN问题
问题描述newDate("2019122910:30:00")在IOS下显示为NaN原因分析带的日期IOS下存在兼容问题解决方法字符串替换letdateStr"2019122910:30:00";datedateStr.repl
Wesley13 Wesley13
3年前
mysql中时间比较的实现
MySql中时间比较的实现unix\_timestamp()unix\_timestamp函数可以接受一个参数,也可以不使用参数。它的返回值是一个无符号的整数。不使用参数,它返回自1970年1月1日0时0分0秒到现在所经过的秒数,如果使用参数,参数的类型为时间类型或者时间类型的字符串表示,则是从1970010100:00:0
Wesley13 Wesley13
3年前
MySQL常用函数
字符串函数concat(a,b,c,...)连接为一个字符串insert(str,x,y,instr)将字符串str从第x位置开始,y个字符长的子串替换为字符串instrLower(str)所有字符变为小写upper(str)所有字符变为大写
可莉 可莉
3年前
2018最新Web前端经典面试试题及答案
javascript: JavaScript中如何检测一个变量是一个String类型?请写出函数实现typeof(obj)"string"typeofobj"string"obj.constructorString请用js去除字符串空格?
贾蔷 贾蔷
1个月前
2024蓝桥杯国赛B组最小字符串题解:贪心算法实战应用
一、题目解读题目要求给定一个长度为N的S和M个待插入字符,通过将这些字符全部插入S中,构造出最小的新字符串。这是典型的字符串构造问题,考察选手对的理解和应用能力。二、解题思路采用贪心策略:1.先将待插入字符,便于按字典序选择2.遍历原字符串时,在保证字典序
硅基生命体
硅基生命体
Lv1
春风十里扬州路,卷上珠帘总不如。
文章
4
粉丝
0
获赞
0