在网络编程中,如果URL参数中含有特殊字符,如‘空格’、‘#’等,可能导致服务器端无法获得正确
的参数值。我们需要将这些特殊符号转换成服务器可以识别的字符。转换的规则是在‘%’的后面跟上
ASII码的两位十六进制的表示。
1. replace函数
public String replaceSpace(StringBuffer str)
{
// 先对str的情况进行判断
if (str == null || "".equals(str.toString()))
{
return str.toString();
}
String newStr = str.toString();
return newStr.replace(" ", "%20");
}
2. 常规思路
从头到尾扫描字符串,每一次碰到空格字符的时候就做替换。
注意:做替换时,空格后面的所有字符都必须后移两个字符。
时间复杂度为O(n^2)的解法
public String replaceSpace(StringBuffer str)
{
String replaceStr = "%20";
// 先对str的情况进行判断
if (str == null || "".equals(str.toString()))
{
return str.toString();
}
StringBuffer newStr = str;
int space = 0; // 空格字符的下标
while ((space = str.indexOf(" ")) != -1)
{
// 先删除该空格
str = str.delete(space, space+1);
// 将要替换的字符串放到该位置,该位置后的字符串后移
str = str.insert(space, replaceStr, 0, replaceStr.length());
}
return str.toString();
}
public String replaceSpace(StringBuffer str)
{
String replaceStr = "%20";
// 先对str的情况进行判断
if (str == null || "".equals(str.toString()))
{
return str.toString();
}
char[] array = str.toString().toCharArray();
int numberOfBlank = 0; // 空格数
int start = 0; // 起始下标
int end = str.length(); // 结束下标
while (start < end)
{
if (array[start] == ' ')
{
numberOfBlank++;
}
start++;
}
// 新数组下标
int newStart = 0;
// 新数组的长度
char[] newArray = new char[array.length + 2 * numberOfBlank];
start = 0; // 置位
while (start < end)
{
newArray[newStart] = array[start];
// 当前字符是空格
if (array[start] == ' ')
{
// 移动后续字符串
for (int i=end-1; i>start; i--)
{
newArray[i+2] = newArray[i];
}
// 做替换
newArray[newStart] = '%';
newArray[newStart+1] = '2';
newArray[newStart+2] = '0';
newStart += 3;
}
else
{
newStart++;
}
start++;
}
return new String(newArray);
}
3. O(n)的解法
一次扫描,碰到空格,就替换为"%20"。
public String replaceSpace(StringBuffer str)
{
String replaceStr = "%20";
// 先对str的情况进行判断
if (str == null || str.length() == 0)
{
return str.toString();
}
StringBuilder newStr = new StringBuilder();
for (int i=0; i<str.length(); i++)
{
if (str.charAt(i) == ' ')
{
newStr.append(replaceStr);
}
else
{
newStr.append(str.charAt(i));
}
}
return newStr.toString();
}