替换空格剑指Offer 05.

题目

请实现一个函数,把字符串 s 中的每个空格替换成"%20"。

示例:输入:s = “We are happy.” 输出:“We%20are%20happy.”

思路

首先扩充数组到每个空格替换成"%20"之后的大小。
然后 从后向前替换空格,也就是双指针法
i指向新长度的末尾,j指向旧长度的末尾。

为什么要从后向前填充,从前向后填充不行么?

从前向后填充就是**O(n^2)**的算法了,因为每次添加元素都要将添加元素之后的所有元素向后移动。

很多数组填充类的问题,都可以先预先给数组扩容带填充后的大小,然后在从后向前进行操作。

从后向前有两个好处:
1、不用申请新数组。
2、从后向前填充元素,避免了从前先后填充元素要来的 每次添加元素都要将添加元素之后的所有元素向后移动。

思路一

1、统计空格的个数 或者直接建立新的数组,将数组的长度扩大为原来的三倍
2、扩充字符串s的大小,也就是每个空格替换成"%20"之后的大小
3、从后先前将空格替换为"%20" 双指针

思路二

1、获得 s 的长度 length
2、创建字符数组 array,其长度为 length * 3
3、初始化 size 为 0,size 表示替换后的字符串的长度
4、从左到右遍历字符串 ,获得 s 的当前字符 c
如果字符 c 是空格,则令 array[size] = ‘%’,array[size + 1] = ‘2’,array[size + 2] = ‘0’,并将 size 的值加 3
如果字符 c 不是空格,则令 array[size] = c,并将 size 的值加 1
5、遍历结束之后,size 的值等于替换后的字符串的长度,从 array 的前 size 个字符创建新字符串,并返回新字符串

StringBuffer方法

String类是字符串常量,是不可更改的常量。
StringBuffer是字符串变量,它的对象是可以扩充和修改的。

StringBuffer和String属于不同的类型,也不能直接进行强制类型转换。

对于StringBuffer而言,本身是一个具体的操作类,所以不能像String那样采用直接赋值的方式进行对象实例化,必须通过构造方法完成。

StringBuffer连接字符操作

  • 当一个字符串的内容需要被经常改变时就要使用StringBuffer。
  • 在StringBuffer中使用append()方法,完成字符串的连接操作。

代码:思路二

class Solution {
    public String replaceSpace(String s) {
        int n = s.length();
        char[] arr = new char[3*n];
        int size = 0;
        for(int i = 0; i < n; i++){
            char c= s.charAt(i);
            if(c == ' '){
                arr[size++] = '%';
                arr[size++] = '2';
                arr[size++] = '0';
            }else{
                arr[size++] = c;
            }  
        }
    String newStr = new String(arr,0,size);
    return newStr;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值