剑指Offer系列——替换空格

地址

https://www.nowcoder.com/practice/4060ac7e3e404ad1a894ef3e17650423?tpId=13&tqId=11155&tPage=1&rp=1&ru=%2Fta%2Fcoding-interviews&qru=%2Fta%2Fcoding-interviews%2Fquestion-ranking

题目

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

思路

首先需要考虑的是是否需要新开辟一个字符串对象,你当然可以直接新建一个StringBuilder然后遍历原有的SB,逐个判断并替换得到结果,不过这样并没有什么意义,虽然能够AC,但是并没有Get到这道题目需要考察的点。
所以我们直接在原来的StringBuilder上修改,首先原有的字符串变长了,我们需要对原有的SB进行扩容,用来容纳新插入的字符。所以先统计其中的空格数,因为替代的字符串为“%20”,所以增加的长度为:空格数*2 (因为3-1)。
然后采用双指针法,第一个指针指向原有字符串最后位,第二个指针指向新字符串最后位,从后往前进行插入,这样移动的字符数最小。如果第一个指针是空格,则在新指针处加入“%20”,如果不为空,则将第一个指针的字符移到第二个指针处。

public class Solution {
    public String replaceSpace(StringBuffer str) {
    	//原位替换,从后往前
        //双指针法,第一个指针起点为原字符串末位,第二个指针起点为新字符串末位
        
        //1.计算空格数,然后得出替换后字符串长度
        int count = 0;
        for(int i = 0;i < str.length();i++){
            if(str.charAt(i) == ' ') count++;
        }
        //如果没有空格,直接返回
        if(count == 0) return str.toString();
        
        int oldIndex = str.length() - 1;//第一个指针
        int newLength = str.length() + count * 2;//新字符串长度
        int newIndex = newLength - 1;//第二个指针
        str.setLength(newLength);//将原SB扩展到新字符串长度
        
        //原位扩展
        while(oldIndex >= 0 && oldIndex <= newIndex){
            if(str.charAt(oldIndex) == ' '){
                //如果当前为空格,进行替换
                str.setCharAt(newIndex--,'0');
                str.setCharAt(newIndex--,'2');
                str.setCharAt(newIndex--,'%');
            }else{
                //不为空格,往后移位
                str.setCharAt(newIndex--,str.charAt(oldIndex--));
            }           
        }
        return str.toString();
    }
}

对于字符串的处理,不要一味的惯性思考从前到后,有时从后往前会有更好的效果。

附:StringBuilder的常用方法

  • 构造方法
StringBuilder() 
构造一个没有字符的字符串构建器,初始容量为16个字符。  
StringBuilder(CharSequence seq) 
构造一个包含与指定的相同字符的字符串构建器 CharSequence(最常用的是StringBuilder/String/StringBuffer) 
StringBuilder(int capacity) 
构造一个没有字符的字符串构建器,由 capacity参数指定的初始容量。  
StringBuilder(String str) 
构造一个初始化为指定字符串内容的字符串构建器。  
  • 常用方法
 StringBuilder append(O) 添加元素
 char charAt(int index) 返回指定索引的char值
 int indexOf(String str)  返回指定子字符串第一次出现的字符串内的索引
 StringBuilder insert(int offset, O) 在指定索引插入指定元素
 int length() 返回长度(字符数)
 int lastIndexOf(String str)  返回指定子字符串最右边出现的字符串内的索引
 StringBuilder replace(int start, int end, String str) 用指定的String中的字符替换此序列的子字符串中的 String 
 StringBuilder reverse()   翻转
 void setLength(int newLength) 设置字符序列的长度
 void setCharAt(int index, char ch)  指定索引处的字符设置为 ch 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值