请实现一个函数,将一个字符串中的空格替换成“%20”。
例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
思路:1,遍历逐一replace替换,由于要移动字符的位置,所以效率较低,需要o(n2)
2,采用replaceAll库函数
3,修改旧字符串的长度为新字符串的长度,即先获取旧字符中空格的个数,然后算出新字符多出来的个数,加上旧字符即可,然后循环从最后一个字符开始判断不为空将旧字符复制到新字符对应的位置setCharAt(公用一个字符串即可),为空则对新指针位置进行替换,指针自减,最后转换为字符串。
/**
* 遍历逐一替换
* @param str
* @return
*/
public String replaceSpace2(StringBuffer str) {
if (str == null || str.length() ==0){
return null;
}
for (int i=0;i < str.length();i++){
if (str.charAt(i) == ' '){
str.replace(i,i+1,"%20");
}
}
return str.toString();
}
/**
* 运用stringbuffer可以原地修改的特性
* 先构造加上空格位置的新长度
* 然后从最后一位开始往后移
* 遇到空格则开始设置新字符
* 直到字符结束
* @param str
* @return
*/
public String replaceSpace4(StringBuffer str) {
if (str == null || str.length() ==0){
return null;
}
int oldP = str.length()-1;
int spaceNumber = 0;
for (int i=0;i<str.length();i++){
if (str.charAt(i) == ' '){
spaceNumber++;
}
}
int newP = oldP + 2*spaceNumber;
str.setLength(newP+1);
//保证新字符串指针大于等于旧指针
while (oldP >= 0 && newP > oldP ){
if (str.charAt(oldP) != ' '){
str.setCharAt(newP,str.charAt(oldP));
oldP--;
newP--;
}else {
str.setCharAt(newP--,'0');
str.setCharAt(newP--,'2');
str.setCharAt(newP--,'%');
oldP--;
}
}
return str.toString();
}
/**
* 库函数
* @param str
* @return
*/
public String replaceSpace3(String str) {
return str.replaceAll(" ","%20");
}
/*
* JDK 1.8
*
* @param oldChar the old character.
*
* @param newChar the new character.
*
* @return a string derived from this string by replacing every occurrence
* of {@code oldChar} with {@code newChar}.
*/
public String replace(char oldChar, char newChar) {
/* value 为当前字符串对象的字符数组名
如果新替换的字符与老字符相同,直接返回当前字符串对象 */
if (oldChar != newChar) {
int len = value.length;// 获取字符串的长度
int i = -1;
char[] val = value; // 新建一个字符数组val引用指向value字符数组,用于
// 此while循环的目的是找出要被替换的第一个字符在字符数组中的下标位置
while (++i < len) {
/* 当找到第一个被替换的字符时,跳出while循环
* 得到了下标i的值,也就是第一个要替换的位置
* 如果到最后没有找到替换的值,那么跳出循环,i的值将与len一样
* 即不会进入下面的if判断,直接返回当前字符串
*/
if (val[i] == oldChar) {
break;
}
}
//当i的值比当前字符串长度len小的时候
if (i < len) {
//使用当前字符串的长度新创建一个字符数组buf
char buf[] = new char[len];
//对下标在i之前的值不需要替换的字符循环赋值给新数组buf
for (int j = 0; j < i; j++) {
buf[j] = val[j];
}
//此处循环是对字符进行替换
while (i < len) {
//没有i++之前把先找到要替换的字符赋值给c
char c = val[i];
/*判断从找到第一个要替换的字符以后 后面的字符是否有与老字符相同的,
如果有,那么把相同的字符替变成新字符,并赋值给buf字符数组
如果不相同,那么就把老字符赋值到buf字符数组中去。
*/
buf[i] = (c == oldChar) ? newChar : c;
//给i+1,直到i>=len,遍历完val最后一个字符后 跳出循环
i++;
}
//把buf变成字符串返回出去
return new String(buf, true);
}
}
return this;
}
总结:
1.copyOf()的实现是用的是arrayCopy();
2.arrayCopy()需要目标数组,对两个数组的内容进行可能不完全的合并操作。
3.copyOf()在内部新建一个数组,是用arrayCopy()将oldArray内容复制到newArray中去,并且长度为newLength。返回newArray;
网友评论