题目描述
请实现一个函数,把字符串中的每个空格替换成 "%20"
。
你可以假定输入字符串的长度最大是 1000
。 注意输出字符串的长度可能大于 1000
。
样例
输入:"We are happy."
输出:"We%20are%20happy."
解法
解法一
利用正则匹配替换。
String str = "We are happy."; str = str == null?null : str.toString().replace(" ", "%20"); System.out.println(str);
解法二
先遍历原字符串,计算空格数,可以得知替换后的字符串长度等于原来的长度加上2乘以空格数目。
用指针 i
指向原字符串末尾,j
指向现字符串末尾,i
, j
从后往前遍历,当 i
遇到空格,j
位置依次要赋值为 '0','2','%'
,此时i移动1位,j移动3位;若不是空格,直接赋值为 i
指向的字符。
思路扩展:
在合并两个数组(包括字符串)时,如果从前往后复制每个数字(或字符)需要重复移动数字(或字符)多次,那么我们可以考虑从后往前复制,这样就能减少移动的次数,从而提高效率。
public class Solution { public static String replaceSpace(StringBuffer str) { int spacenum = 0;// spacenum为计算空格数 for (int i = 0; i < str.length(); i++) { if (str.charAt(i) == ' ') spacenum++; } int indexold = str.length() - 1; // indexold为为替换前的str下标 int newlength = str.length() + spacenum * 2;// 计算空格转换成%20之后的str长度 int indexnew = newlength - 1;// indexold为为把空格替换为%20后的str下标 str.setLength(newlength);// 使str的长度扩大到转换成%20之后的长度,防止下标越界 for (; indexold >= 0 && indexold < newlength; --indexold) { if (str.charAt(indexold) == ' ') { // str.setCharAt(indexnew--, '0'); str.setCharAt(indexnew--, '2'); str.setCharAt(indexnew--, '%'); } else { str.setCharAt(indexnew--, str.charAt(indexold)); } } return str.toString(); } public static void main(String[] args) { String str = "We are happy."; StringBuffer s = new StringBuffer(str); String newstr = replaceSpace(s); System.out.println(newstr); } }
时间复杂度O(n)