package offer2;
/**
* 请实现一个函数,将一个字符串中的空格替换成"%20".
* 例如,当字符串为
* We Are Happy.
* 则经过替换之后的字符串为
* We%20Are%20Happy.
* <p>
* 思路:
* 统计空格的个数,从后往前遍历
* 例如:
* <p>
* We_Are_Happy
* We__Are__Happy
* <p>
* 可以看出Are向后移动1位,Happy向后移动2位
* <p>
* 那可想而知
* <p>
* We_Are_Happy_And_You?
* We__Are__Happy__And__You?
* <p>
* 可以看出Are移动1位,Happy移动2位,And移动3位,You移动4位
*
* @author RhymeChiang
* @date 2018/01/14
**/
public class Offer02 {
/**
* 替换的内容
*/
public static final String REPLACE = "%20";
public static final char BE_REPLACE = ' ';
/**
* 替换str中的空格为%20
*
* @param str
* @return
*/
public static String replaceSpace(String str) {
//遍历求出字符串中的空格数量
int spaceCount = 0;
//将字符串str转化为char数组
char[] chars = str.toCharArray();
for (char c : chars) {
if (BE_REPLACE==c) {
spaceCount++;
}
}
//创建新数组,容量大小为原数组容量加上替换字符长度-被替换字符长度
char[] newCharArray = new char[chars.length+ spaceCount*2];
//将原数组数据拷进新数组中
//并在拷贝的时候调整元素位置
int space = 0;
for (int i = 0; i < chars.length; i++) {
//如果遇到空格
if(BE_REPLACE==chars[i]){
newCharArray[i+space*2]=REPLACE.charAt(0);
newCharArray[i+1+space*2]=REPLACE.charAt(1);
newCharArray[i+2+space*2]=REPLACE.charAt(2);
space++;
}
//遇到空格之前正常拷入
else if(space==0){
newCharArray[i] = chars[i];
}
//遇到空格了那么之后的字符串都要进行相应的平移
//平移的位数为当前的空格数
else{
newCharArray[i+space*2]=chars[i];
}
}
return new String(newCharArray);
}
public static void main(String[] args) {
String str="We are Happy";
System.out.println(replaceSpace(str));
}
}
运行结果: