剑指OFFER笔记_05_替换空格_JAVA实现

题目:替换空格

  • 请实现一个函数,把字符串中的每个空格替换成"%20"。例如,输入"We are happy.",则输出"We%20are%20happy."。

解题思路

  • 如果对原字符串的元素遍历,遇到空格就将所有元素后移两位,时间复杂度为O(n^2)。
  • 所以我采用了时间复杂度O(n),空间复杂度为O(n)的算法。
  • 首先遍历一次字符串,将空格的数量spaceCounter记录下来,用于确定待会儿需要建立的辅助存储的大小。
  • 确定了空格数之后,建立一个辅助数组,大小为原字符串长度加上2*spaceCounter。
  • 第二次遍历原字符串,遇到空格则往辅助数组中填入"%20",否则填入当前字符。
  • 最后该函数需要返回一个String类型的字符串,所以还要对数组进行转换。
  • Tips:此处不可以对char[] 使用Object类自带的.toString()函数,否则得出的结果将是这样:
    在这里插入图片描述
  • 我在查阅API文档后发现原因是这样的:
    在这里插入图片描述
  • 返回的值是一个"类名+@+16进制哈希码",并不是我们需要的字符串。
  • 所以我用了String的一种构造函数来达到要求:
    在这里插入图片描述
  • 构造函数的语句像这样:String finalString = new String(result, 0, j);

用例解析

  • 测试用例为"i love china."
  • 这个字符串转换的数组长度是13。(此处与C++中不一样,C++中是14,因为结尾还有一个’\0’)
  • 由于有2个空格,所以辅助存储的数组长度为13+2*2=17。
  • 过程如下图:
    在这里插入图片描述

代码

函数主题部分代码

package q05;

public class Solution {
	public static String replaceSpace(String s)
	{
		//特殊情况处理
		if(s == null)
		{
			return "ERROR";
		}
		
		//将原字符串给转换成字符数组
		char[] array = s.toCharArray();
		
		//对空格计数。
		int spaceCount = 0;
		for (int i = 0; i < array.length; i++) 
		{
			if(array[i] == ' ')
			{
				spaceCount++;
			}
		}
		
		//新建一个存放结果的字符数组
		char[] result = new char[array.length + 2 * spaceCount];
		int j = 0;	//用于记录当前result操作的位置
		
		for (int i = 0; i < array.length; i++) 
		{
			//遇到空格就填入"%20"
			if(array[i] == ' ')
			{
				result[j++] = '%';
				result[j++] = '2';
				result[j++] = '0';
			}else	//其他情况照常复制进去
			{
				result[j++] = array[i];
			}
		}
		//最终的结果用字符串来返回
		//new String(result,0,j)代表将result从下标0开始,复制j个元素进入String中
		String finalString = new String(result, 0, j);
//		此种写法不可取!
//		String finalString = result.toString();
		return finalString;
	}
}

测试部分代码

package q05;

public class TestApp {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String str = null;
		System.out.println(Solution.replaceSpace(str));
		
		str = "i love china.";
		System.out.println(Solution.replaceSpace(str));
		
		str = "   ";
		System.out.println(Solution.replaceSpace(str));
	}
}

测试运行结果

在这里插入图片描述

LeetCode运行结果

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值