【剑指offer】【2】字符串的空格

时间限制:1秒 空间限制:32768K 热度指数:594664
本题知识点: 字符串

题目描述

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

知识补充:

1、StringBuffer

    是可变类,在修改字符串内容时,不会创建新的对象,因此它比String类更适合修改字符串。 

  • StringBuffer如何转换成数组

        StringBuffer类没有提供同String一样的toCharArray方法,因此需要使用toString方法转换成String类型然后调用toCharArray方法转换成数组。

  • StringBuffer的输出打印

        StringBuffer对象有一个toString()方法,就是将你的缓存的字符串打印出来,是String类型的

2、单引号和双引号的区别

  • 单引号引的数据,是char类型的。双引号引的数据,是String类型的;
  • char定义时用单引号,只能有一个字母,数字:char c='c'。而String用双引号,可以是一个,也可能是多个字母,汉字等。就是所谓的字符串:String s="adsaf";
  • char只是一个基本类型,而String 可以是一个类,可以直接引用。比如char c='c',不能直接对c调用方法。String s="abc";。这时可以调用s.charAt(0);等方法,因为String是类,这是就是对象的调用了。
3、Str ingBuffer的常用方法

  • toString():转换为字符串
  • toCharArray():将字符串转换为字符数组
  • charAt(index):按照index索引值
  • setCharAt(index,value):按照index设置
  • setLength(newLength):设置长度

本人代码:
public class Solution {
    public String replaceSpace(StringBuffer str) {
        char[] ch = str.toString().toCharArray();
        StringBuffer strr = new StringBuffer();
        for(int i = 0; i < ch.length;i++){
            if(ch[i] == ' '){
                strr.append("%20");
            }else{
                strr.append(ch[i]);
            }
        }
        return strr.toString();
    }
}


改进:

考虑空间复杂度,不new对象。

如果不把字符串转换为数组,直接处理字符串也行。使用str.charAt也可以对字符串进行遍历。

如果从前向后遍历,遇到空格就替换成“%20”,那么其后的字符串的内容就会被替换掉,因为没有开辟新的字符串用的是用一个str。因此如果可以先将字符串的长度进行扩充,那么扩充的部分目前还是空可以存放东西,若从后向前更新字符串就不会出现字符串被覆盖消失的问题。

思路二:先计算需要多少空间,然后从后向前遍历,不断填充,遇到空格替换成“%20”即可。

public class Solution {
    public String replaceSpace(StringBuffer str) {
    	//计算空格的数量
        int num = 0;
        for(int i = 0; i < str.length();i++){
            if(str.charAt(i) == ' '){
                num++;
            }
        }
        //计算新字符串的长度
        int newLength = str.length() + 2*num; 
        //设置两个指针,一个是从后向前遍历字符串查找空格,另一个是从后向前更新填充后的字符串
        int indexOld = str.length() -1; 
        int indexNew = newLength - 1; 
        //扩充字符串长度
        str.setLength(newLength); 
        //从后向前遍历,并进行更新
        for(; indexOld >=0  && indexNew >= 0; indexOld--){
            if(str.charAt(indexOld) == ' '){
                str.setCharAt(indexNew--,'0');
                str.setCharAt(indexNew--,'2');
                str.setCharAt(indexNew--,'%');
            }else{
                str.setCharAt(indexNew--, str.charAt(indexOld));
            }
        }
        return str.toString();
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值