题目:请实现一个函数,把字符串中的每个空格替换成"%20"。例如输入“We are happy.”,则输出“We%20are%20happy.”。
——来源于《剑指offer》
代码实现
import java.util.*;
class ReplaceBlank {
public static char[] solution(char[] chs) {
if (chs == null || chs.length < 0) {
return null;
}
// 空格数
int blankNum = 0;
// 遍历统计字符数组的空格数
for (int i = 0; i < chs.length; i++) {
if (chs[i] == ' ') {
blankNum++;
}
}
// 扩容数组
chs = Arrays.copyOf(chs, chs.length + blankNum * 2);
// 设置首尾指针
int p1 = chs.length - 1 - blankNum * 2;
int p2 = chs.length - 1;
while (p1 < p2) {
if (chs[p1] == ' ') {
chs[p2--] = '0';
chs[p2--] = '2';
chs[p2--] = '%';
} else {
chs[p2--] = chs[p1];
chs[p1] = ' ';
}
p1--;
// 每次操作之后输出操作后的字符串,方便提调试
// System.out.println(new String(chs) + " p1:" + p1 + " p2:" + p2);
}
return chs;
}
public static void main(String[] args) {
char[] s = "we are happy".toCharArray();
System.out.println(new String(solution(s)));
}
}
需要注意的地方
- 扩容数组的时候是空格数的2倍,不是空格数的3倍,因为字符串中原本的空格就占有一位
java
的字符串类型没有'\0'
结尾
拓展:将两个排序数组合并
package com.qianyu.jianzhioffer;
import java.util.*;
/**
* @author lijing
* @date 2019-07-18-13:00
* @discroption
*/
public class TwoSortedArray {
public static void main(String[] args) {
int[] arr1 = {1, 3, 6, 9, 10};
int[] arr2 = {2, 4, 8, 11, 12};
int[] res = solution(arr1, arr2);
System.out.println(Arrays.toString(res));
}
private static int[] solution(int[] arr1, int[] arr2) {
// 扩容数组
int[] newArr = Arrays.copyOf(arr1, arr1.length + arr2.length);
// 两个指针,p1指向arr1的末尾,p2指向newArr的末尾,p3指向arr2的末尾
int p1 = arr1.length - 1;
int p2 = newArr.length - 1;
int p3 = arr2.length - 1;
while (p1 != p2 && p3 >= 0) {
if (arr2[p3] >= arr1[p1]) {
newArr[p2--] = arr2[p3--];
} else {
newArr[p2--] = arr1[p1--];
}
System.out.println(Arrays.toString(newArr) + " p1:" + p1 + " p2:" + p2+ " p3:" + p3);
}
return newArr;
}
}
运行结果: