剑指Offer_编程题——替换空格

题目描述:

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

考察知识点:

时间限制:1秒 空间限制:32768K
本题知识点: 字符串

思路

最简单的方法是使用replaceAll(" ", "%20")这个函数,但是本题考察的是字符串的操作,所以不用这个函数。
思路:
1)对给定的字符串变成字符数组。
2)获取字符数组中空格的数量spaceCount
3)对字符数组扩容到原数组长度len+spaceCount*2,新数组长度记为newLen
4)指针1从原字符数组长度(len - 1)处,向头开始遍历字符数组。指针2从newLen-1处往回遍历。
5)如果指针1指向的值是非空格字符,则指针2的值为(newLen - 1 - spaceCount * 2)的值(即指针1 的坐标),两个指针同时左移1位。
6)如果指针1指向的值是空格字符。那么指针2的值为’0’,左移1位,指针的值为’2’,再左移1位,指针2的值为’%’。spaceCount相应的减1,两个指针同时左移1位。

画图说明

对于字符串We Are So Happy.,变成字符数组后如下:
在这里插入图片描述
获取空格的数量spaceCount为3。数组长度len=16。
扩容长度为len+spaceCount*2=22。扩容后如图:
在这里插入图片描述

从后向前遍历数组,21处为(newLen - 1 - spaceCount * 2)=(22 - 1 - 3*2) = 15,即为坐标15的内容’.’,以此类推、
当遇到空格字符,则插入3个字符为:‘0’,‘2’,’%’。最后变成如下:
在这里插入图片描述

参考代码:

package com.sunshuo.java.offer;

import java.util.Arrays;

/**
 * <p>Title:Solution02a</p>
 * <p>Description:请实现一个函数,将一个字符串中的每个空格替换成“%20”。
 * 例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。</p>
 * @author SunShuo
 * @version 1.0
 * @date 2018年12月18日 上午10:05:28
 */
public class Solution02b {
    public static void main(String[] args) {
        System.out.println(replaceSpace(new StringBuffer("We Are So Happy.")));
    }

    public static String replaceSpace(StringBuffer str) {
        String s = str.toString();
        char[] charArray = s.toCharArray();
        int len = charArray.length;
        int spaceCount = 0;
        //遍历字符数组,获取空格的数量
        for (int i = 0; i < len; i++) {
            if (charArray[i] == ' ') {
                spaceCount++;
            }
        }
        int newLen = len + spaceCount * 2;
        charArray = Arrays.copyOf(charArray, newLen);//扩容
        //从后向前遍历数组,移动字符,遇到空格,放入%20
        for (int i = newLen - 1; i >= 0; i--) {
            if (charArray[len - 1] != ' ') {
                charArray[i] = charArray[i - spaceCount * 2];
            } else {
                charArray[i--] = '0';
                charArray[i--] = '2';
                charArray[i] = '%';
                spaceCount--;
            }
            len--;
        }
        return new String(charArray);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值