PS:《剑指offer》是很多同学找工作都会参考的一本面试指南,同时也是一本算法指南(为什么它这么受欢迎,主要应该是其提供了一个循序渐进的优化解法,这点我觉得十分友好)。现在很多互联网的算法面试题基本上可以在这里找到影子,为了以后方便参考与回顾,现将书中例题用Java实现(第二版),欢迎各位同学一起交流进步。
GitHub: https://github.com/Uplpw/SwordOffer。
剑指offer完整题目链接: https://blog.csdn.net/qq_41866626/article/details/120415258
1 题目描述
实现一个函数,把字符串中的每个空格都替换成“%20”。
leetcode链接: 替换空格(以下代码已测试,提交通过)
2 测试用例
一般是考虑功能用例,特殊(边缘)用例或者是反例,无效测试用例这三种情况。甚至可以从测试用例寻找一些规律解决问题,同时也可以让我们的程序更加完整鲁棒。
(1)功能用例:字符串有一个或者多个空格
(2)反例:字符串没有空格,或字符串长度为0
(3)无效用例:数组是null
3 思路
分析:
由于在Java中字符串String类型是不可变类型,所以没办法像C++一样在原来的字符串上进行修改,因此必须要开一个新的空间进行处理。
下面是几种解法思路以及时间空间复杂度比较。
解法1:利用Java字符串工具库(不建议)
s.replace(" ","%20")
,该方法直接满足题意要求,比较简单。
解法2:遍历字符串,逐个进行替换
首先遍历字符串记录空格数,然后计算总共需要的空间大小( s . l e n g t h ( ) + s p a c e C o u n t ∗ 2 s.length()+spaceCount*2 s.length()+spaceCount∗2),创建字符数组,并重新遍历字符串,遇到空格替换,否则原字符存入。
时间空间复杂度: O ( n ) , O ( n ) O(n),O(n) O(n),O(n)
解法3:遍历字符串,利用StringBuild
和解法2类似,只是使用StringBuild进行存储,不需要提前计算字符数组空间。遍历字符串,遇到空格则把 %20 添加,否则添加原字符。
时间空间复杂度: O ( n ) , O ( n ) O(n),O(n) O(n),O(n)
4 代码
public class ReplaceSpace {
// 解法1(比较简单,不再赘述)
// 解法2
public static String replaceSpace1(String s) {
if (s == null || s.length() == 0) {
return s;
}
int length = s.length();
int spaceCount = 0;
for (int i = 0; i < length; i++) {
if (s.charAt(i) == ' ') {
spaceCount++;
}
}
char[] replaceArray = new char[length + spaceCount * 2];
int index = 0;
// 从头或者从尾都一样
for (int i = 0; i < length; i++) {
if (s.charAt(i) == ' ') {
replaceArray[index++] = '%';
replaceArray[index++] = '2';
replaceArray[index++] = '0';
} else {
replaceArray[index++] = s.charAt(i);
}
}
return String.valueOf(replaceArray);
}
// 解法3
public static String replaceSpace2(String s) {
if (s == null || s.length() == 0) {
return s;
}
StringBuilder sb = new StringBuilder();
int length = s.length();
for (int i = 0; i < length; i++) {
char c = s.charAt(i);
if (c == ' ') sb.append("%20");
else sb.append(c);
}
return sb.toString();
}
public static void main(String[] args) {
String s = "We are happy.";
System.out.println(replaceSpace1(s));
System.out.println(replaceSpace2(s));
}
}
参考
在解决本书例题时,参考了一些大佬的题解,比如leetcode上的官方、K神,以及其他的博客,在之后的每个例题详解后都会给出参考的思路或者代码链接,同学们都可以点进去看看!
本文如有什么不足或不对的地方,欢迎大家批评指正,最后希望能和大家一起交流进步、拿到心仪的 offer !!!