【剑指Offer-Java】5题:替换空格

面试题5:替换空格

题目描述

请实现一个函数,将一个字符串中的每个空格替换成“%20”。
例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。

思路

一、时间复杂度为O(n^2)的方法:
本题乍一看很简单,以为一边遍历数组一边替换就行了,但是!原来空格’ '只占一个存储空间,但替换的"%20"要三个存储空间,上述方法势必需要边替换边向后移位,替换每个空格都要移动后面O(n)个字符,若字符串长度是n,则时间复杂度就是O(n^2),有点耗时,需要减少移位操作来减少时间。

二、时间复杂度为O(n)的方法:

  1. 先从前往后遍历,求出字符串中空格的总数spaceNum
  2. 从而确定替换后的新字符串的长度lengthNew(每个空格替换后比原来多了个字符,所以新长度=原长度+空格总数*2
  3. 定义两个索引(类似C++里面的指针),分别指向原字符串的末尾indexOld和新字符串的末尾indexNew
  4. 两个索引同时从后往前移动:
    若indexOld遇到了空格就用"%20"替换空格,,原索引向前移动1步,新索引向前移动3步;
    若indexOld还未遇到空格,新索引就依次向前复制原字符串的内容

三、利用Java库函数的方法:
直接使用Java自带的替换函数replaceAll(“待替换字符的正则表式”,“用来替换的字符”)
空格的正则表式是:\\s

也可以把字符存储到StringBuffer中,利用StringBuffer的append()方法

实现

时间复杂度为O(n)的方法:

     /*
	 * 法1:各种语言都适用的思路,不直接使用Java自带的替换函数replaceAll()
	 */
	public String replaceSpace(StringBuffer str) {
		//不用排除空串情形,下面已经包括了,若没有空格就直接输出空串
        
        int spaceNum=0;    //定义字符串中空格总数
        
        //====从前向后遍历字符串,获得空格总数====
        for(int i=0;i<str.length();i++) {
        	if(str.charAt(i)==' ') {
        		++spaceNum;
        	}
        }
        
        int lengthOld=str.length(); //原始字符串长度
        int indexOld=lengthOld-1;   //指向原始字符串末尾的索引
        
        //定义替换后的字符串长度和末尾索引
        int lengthNew=lengthOld+spaceNum*2;
        int indexNew=lengthNew-1;
        
        //扩展字符串长度
        str.setLength(lengthNew);
        
        //====从后往前替换空格 ====
        while(indexOld>=0 && indexNew>indexOld) {
        	if(str.charAt(indexOld)==' ') {     //若旧索引遇到空格,从后向前用'0''2''%'替换空格
        		str.setCharAt(indexNew--, '0');
        		str.setCharAt(indexNew--, '2');
        		str.setCharAt(indexNew--, '%');
        	}
        	else {
        		str.setCharAt(indexNew--, str.charAt(indexOld));
        	}
        	--indexOld;
        }
        //把StringBuffer转换成String 类型
        String s=str.toString();
        return s;
    }

利用Java库函数的方法:

     /*
	 * 法2:直接使用Java自带的替换函数replaceAll("待替换字符的正则表式","用来替换的字符")
	 */
	public String replaceSpace1(StringBuffer str) {
		//先把StringBuffer转换成String
		String s=str.toString();
		//再直接调用replaceAll函数,改变变量s的内容
		s=s.replaceAll("\\s", "%20");    //空格的正则表式:\\s
		return s;
	}

或者把字符存储到StringBuffer中,利用StringBuffer的append()方法,遍历到空格就加入“%20”,不是空格就加入遍历到的字符

public String replaceSpace(StringBuffer str) {
    	//利用StringBuffer的append方法(StringBuffer是可变类)
        //先创建StringBuffer对象
        StringBuffer sb=new StringBuffer();
        //把给的StringBuffer对象转换成String,遍历后依次放进StringBuffer对象里
        String s=str.toString();
        for(int i=0;i<s.length();i++){
            char c=s.charAt(i);
            if(String.valueOf(c).equals(" ")){  //" "是String类型,所以必须先把c转换成String类型
                sb.append("%20");
            }
            else{
                sb.append(c);
            }
        }
        return sb.toString();
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值