一.前言
本系列文章为《剑指offer》算法讲解。
共享资源:资源链接
二.题目描述
请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
1.题目分析
(1)首先我们看到这个题目时,我们应该想到,我们如何对一个字符串里面的字符进行操作,如果直接对字符串进行操作的话,那么我们能做的只是对字符串进行拼接,转换等一系列整体的操作,无法对里面单独的字符进行操作。
(2)所以我们只能把字符串转换成我们能操作的数据格式,我们常常做的就是字符串转换成字符数组,然后我们就将对字符串的操作转换为数组的操作。
(3)学习算法,我感觉研究到底的话,其实就是对数组和字符串的操作。这篇就是对字符串和字符串数组的描述,我感觉写的很好,分析给大家。
字符串和字符串数组
2.举例
对题目的流程,我自己画图不太好看,大家可以看一下这个算法流程描述博客,我感觉画的很清晰,自己可以看一下,跟着把替换空格的流程走一遍,就会理解这个算法的思路。
3.编程实现
主要实现:
public static String replaceStr(String str) {
if(StringUtils.isEmpty(str)) {
return null;
}
char[] arrayStr = str.toCharArray();
int spaceNum = 0;
for (char array : arrayStr) {
if(array == ' ') {
spaceNum++;
}
}
// 由于使用%20替换一个空格,%20占三个字符,空格占一个字符,所以比原先多占两个字符的位置
int newLength = arrayStr.length + spaceNum*2;
char[] newStr = new char[newLength];
int arrayStrIndex = arrayStr.length - 1;
int newStrIndex = newStr.length - 1;
for(; arrayStrIndex >= 0; arrayStrIndex--) {
if(arrayStr[arrayStrIndex] != ' ') {
newStr[newStrIndex--] = arrayStr[arrayStrIndex];
continue;
}
newStr[newStrIndex--] = '0';
newStr[newStrIndex--] = '2';
newStr[newStrIndex--] = '%';
}
return new String(newStr);
}
测试:
public static void main(String[] args) {
String str = "程序员 曹 先 生";
System.out.println("替换后的字符为:"+replaceStr(str));
}
结果:
4.代码说明与开发过程中遇到的问题
(1)首先大家要对字符,字符串,字符数组搞明白,才能对这道题目下手。我刚开始写的时候,感觉将字符串转换为字符数组,然后遍历数组就可以搞定了,但是我忽略了一个重要的点就是“空格只占一个字符,而%20占3个字符”,导致我后面写错了。
(2)我想几乎大多数人估计刚开始都是采用找到一个空格就替换的方法,但是查找空格的数量和替换空格最好不要并行操作,因为在不知道空格的数量下,我们是不知道字符数组的长度的。如果我们遍历数组的时候,找到空格就会替换的话,就会造成后面数据的混乱,操作很复杂,很乱。
5.总结
对字符串,字符串数组,字符的操作要熟练掌握,不然我们即使我们知道一个算法怎么解,但是我们也是无法开始做的,不能让最简单的东西挡住我们。