剑指offer-2、替换空格

题目描述

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

思路及解答

调⽤API函数

java ⾥⾯有可以直接使⽤的函数replace() ,直接写成下⾯这样即可通过。

java 复制代码
public String replaceSpace(StringBuffer str) {
	String result = str.toString().replace(" ","%20");
	return result;
}

使用StringBuilder拼接

使用额外的空间。对字符串进行遍历,然后使用StringBuilder进行字符串的拼接,遇到空格添加%20,没有则直接添加。

java 复制代码
public class Solution {
    public String replaceSpace(StringBuffer str) {
        //如果字符串为空的话,直接返回null
        if(str == null) return null;
        StringBuilder sb = new StringBuilder();
        for(int i = 0; i < str.length(); i++){
            if(str.charAt(i) == ' '){
                sb.append("%20");
            }else{
                sb.append(str.charAt(i));
            }
        }
        return sb.toString();
    }
}

但是这里用到了额外的空间,额外用到StringBuilder进行存储

不使用额外空间

不使用额外的空间,那么我们只能在原String上进行修改了:

  1. 将字符串转换成为字符数组,遍历⼀次,统计出空格的个数。
  2. 对数组进行扩容,保证空格替换成%20有足够的空间:初始化的⼤⼩ = 原来的字符数组⻓度 + 空格⻓度 x 2
  3. 遍历⼀次,复制,当不为空格时直接复制,当为空格时,则把 %20 这三个字符复制过去。
java 复制代码
public class Solution {
	public String replaceSpace(StringBuffer str) {
		// 转换成为字符数组
		char[] originChars = str.toString().toCharArray();
		int spaceNum = 0;
		// 计算出空格的个数
		for (int i = 0; i < originChars.length; i++) {
			if (originChars[i] == ' ') {
				spaceNum++;
			}
		}
		// 新字符数组的⻓度
		int newCharsLength = originChars.length + 2 * spaceNum;
		int newStrIndex = 0;
		for (int index = 0; index <= originChars.length - 1; index++) {
			if (originChars[index] != ' ') {
				// 直接复制
				newChars[newStrIndex++] = originChars[index];
			} else {
				// 空格则需要复制三个字符
				newChars[newStrIndex++] = '%';
				newChars[newStrIndex++] = '2';
				newChars[newStrIndex++] = '0';
			}
		}
		// 转成字符串
		return new String(newChars);
	}
}
相关推荐
掘金-我是哪吒24 分钟前
分布式微服务系统架构第156集:JavaPlus技术文档平台日更-Java线程池使用指南
java·分布式·微服务·云原生·架构
亲爱的非洲野猪1 小时前
Kafka消息积压的多维度解决方案:超越简单扩容的完整策略
java·分布式·中间件·kafka
wfsm1 小时前
spring事件使用
java·后端·spring
微风粼粼1 小时前
程序员在线接单
java·jvm·后端·python·eclipse·tomcat·dubbo
缘来是庄1 小时前
设计模式之中介者模式
java·设计模式·中介者模式
rebel2 小时前
若依框架整合 CXF 实现 WebService 改造流程(后端)
java·后端
代码的余温3 小时前
5种高效解决Maven依赖冲突的方法
java·maven
慕y2743 小时前
Java学习第十六部分——JUnit框架
java·开发语言·学习
paishishaba3 小时前
Maven
java·maven
张人玉4 小时前
C# 常量与变量
java·算法·c#