面试题4:请实现一个函数,把字符串中的每个空格替换成“%20”。例如输入“We are happy.”,则输出“We%20are%20happy.”。
我的实现是借助了新的内存空间,即创建了一个新数组往里移动数据。
代码实现:
package com.practice;
public class StringReplace {
private static String stringReplace(String str) {
if (str == null) {
return null;
}
char[] strToChar = str.toCharArray();
// 计算字符串中的空格个数
int count = 0;
for (char ch : strToChar) {
if (ch == ' ') {
count++;
}
}
if (count == 0) {
return str;
}
// 创建一个新数组
char[] newStrCharArr = new char[count * 2 + strToChar.length];
int newSum = newStrCharArr.length;
int index = --newSum;
// 根据原数组从后往前查找空格位置,将元素插入新数组
// (其实从前往后遍历也是一样的,都是往新数组里面添加数据,看习惯吧,其实我习惯从前往后遍历,还不容易出错)
for (int sum = strToChar.length - 1; sum >= 0; sum--) {
if (strToChar[sum] != ' ') {
newStrCharArr[index--] = strToChar[sum];
} else {
newStrCharArr[index--] = '0';
newStrCharArr[index--] = '2';
newStrCharArr[index--] = '%';
}
}
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i <= newSum; i++) {
stringBuilder.append(newStrCharArr[i]);
}
return stringBuilder.toString();
}
public static void main(String[] args) {
String str = " a b c d e f ";
System.out.println(stringReplace(str));
}
}
题目分析:
肯定不能用String.replace()方法,但是从java角度来讲,就是实现一下repalce的源码。
可以去看一下源码实现。
这里实现的就是指定替换的" " -> "%20"
先计算原字符串的空格个数,创建一个新char数组,长度就是原字符串长度+空格个数*2,因为要用一个空格替换三个字符。
时间复杂度为O(n)的方法就这么写,根据原字符串,从后往前遍历,新字符串也是从后往前填充,
(其实从前往后遍历也是一样的,都是往新数组里面添加数据,看习惯吧,其实我习惯从前往后遍历,还不容易出错)