《剑指Offer》替换空格


题目1:替换空格

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

示例 1:

1
2
输入:path = "We are happy."
输出:"We%20are%20happy"

在Java中每对String类型的对象进行操作都会生成一个新的对象,所以我们需要避免使用原字符串进行操作。

解法一:使用StringBuilder

我们需要使用StringBuilder来构造最终的结果,遇到空格时加上"%20"。

1
2
3
4
5
6
7
8
9
10
11
12
13
public String replaceSpace(String s) {
char[] charArray = s.toCharArray();
StringBuilder sb = new StringBuilder();
for (char c : charArray) {
if (c == ' ') {
sb.append("%20");
}
else {
sb.append(c);
}
}
return sb.toString();
}

时间复杂度O(n) 空间复杂度O(n)

解法二:使用数组

直接使用char的数组来表示结果,由于原字符串的char[]长度不够,所以还是需要新建数组。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public String replaceSpace(String s) {
char[] charArray = s.toCharArray();
int cntSpace = 0;
for (char c : charArray) {
if (c == ' ') {
cntSpace++;
}
}
int resultLength = charArray.length + 2 * cntSpace;
char[] resultCharArray = new char[resultLength];
int indexInResult = resultLength - 1;
for (int i = charArray.length - 1; i >= 0; i--) {
if (charArray[i] == ' ') {
resultCharArray[indexInResult--] = '0';
resultCharArray[indexInResult--] = '2';
resultCharArray[indexInResult--] = '%';
}
else {
resultCharArray[indexInResult--] = charArray[i];
}
}
return new String(resultCharArray);
}

这边的遍历顺序是从后往前遍历,在题目1中与使用从前往后遍历的效果没有区别,但是如果原数组的长度本身就足够的,那么就需要从后往前把字符填进去,下面看题目2理解一下。

题目2:将一个排序数组插入到另一个排序数组

有两个排序数组A1,A2,A1末尾有足够多的空余空间容纳A2,实现一个函数将A2插入A1,并所有数字是排序的。

示例1:

1
2
输入:A1: [1, 3, 5, 7, NULL, NULL, NULL, NULL]  A2: [2, 4, 6, 8]
输出:A1: [1, 2, 3, 4, 5, 6, 7, 8]

解法一:倒序遍历数组

因为最终的结果是需要存入A1中的,所以我们需要在A1原数组上做修改。如果使用从前往后遍历,那么就会涉及元素的移动,但是从后往前遍历就不会有这个问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public Integer[] mergeArrayInFirst(Integer[] a1, Integer[] a2) {
int indexA1 = a1.length - 1;
for (; indexA1 >= 0; indexA1--) {
if (a1[indexA1] != null) {
break;
}
}
int indexA2 = a2.length - 1;
int indexResult = a1.length - 1;
while (indexA1 >= 0 || indexA2 >= 0) {
if (indexA1 < 0) {
a1[indexResult] = a2[indexA2];
indexA2--;
}
else if (indexA2 < 0) {
a1[indexResult] = a1[indexA1];
indexA1--;
}
else {
if (a1[indexA1] >= a2[indexA2]) {
a1[indexResult] = a1[indexA1];
indexA1--;
}
else {
a1[indexResult] = a2[indexA2];
indexA2--;
}
}
indexResult--;
}
return a1;
}

相关代码

https://gitee.com/zhaomin6666/coding-interview/tree/main/src/main/java/com/zm/interview/chapter02/ex003