剑指OFFER笔记_05_替换空格_JAVA实现
- 题目:替换空格
- 解题思路
- 用例解析
- 代码
- 函数主题部分代码
- 测试部分代码
- 测试运行结果
- LeetCode运行结果
题目:替换空格
- 请实现一个函数,把字符串中的每个空格替换成"%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运行结果