---
layout: post
title: "剑指offer_Question4"
date: 2017-08-02 21:31:37 +0800
comments: true
categories: algorithm
---
package test;
/*
* 替换空格
* 实现一个函数,将字符串中的空格替换成%20
*/
public class Question4 {
public static String replaceBlank(String string){
/*
* 可以直接创建一个新的字符串/StringBuffer,然后对输入的字符串进行遍历,如果遇到字符,
* 则加在新字符串的末尾;如果遇到空格,就在新字符串的末尾加入%20,返回新的字符串即可。
*/
StringBuffer stringBuffer=new StringBuffer();
for(int i=0;i<string.length();i++){
if (string.charAt(i)==' ') {
stringBuffer.append("%20");
}else{
stringBuffer.append(string.charAt(i));
}
}
return stringBuffer.toString();
}
public static String replaceBlank2(String string){
/*
* 直接使用String.repalce(char old,char new)
* 返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。
* 该方法只能替换一个字符
*
* replace(CharSequence target, CharSequence replacement)
*使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串。
*该方法可以替换字符串
*
*replaceAll(String regex, String replacement)
*使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。。
*/
return string.replace(" ","%20");
}
public static String replaceBlank3(String string){
/*
* 使用类似于剑指offer中的方法,对原来字符串中的字符一个一个进行复制
* 先统计原本字符串中的空格个数x,则新的字符串的长度比原来字符串长2x
* 定义两个指针p1,p2,其中p1初始指向原来字符串的末尾位置,p2指向新字符串的末尾位置
* 当p1遇到的字符不是空格时,将该字符复制到新字符串,同时p1,p2向前移动一个位置
* 当p1遇到的字符为空格时,p1往前移动一个位置,p2往前移动三个位置,同时在这三个位置上添加%20
* 当p1,p2的索引相同时,说明前面没有空格了
*
* 简易新建一个字符数组为新的字符串,以空间换时间
*
*/
int blankCount=0;
for(int i=0;i<string.length();i++){
if (string.charAt(i)==' ') {
blankCount++;
}
}
char[] newString=new char[string.length()+blankCount*2];
int p1=string.length()-1,p2=newString.length-1;
while(p1>=0&&p2>=0){
if (string.charAt(p1)!=' ') {
//当前字符非空,则复制且两个指针都往前移一个
newString[p2]=string.charAt(p1);
p1--;
p2--;
}else if (string.charAt(p1)==' ') {
p1--;
newString[p2]='0';
p2--;
newString[p2]='2';
p2--;
newString[p2]='%';
p2--;
}
}
return String.valueOf(newString);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(replaceBlank2("ni hao wo "));
}
}