题目:请实现一个函数,把字符串中的每个空格替换成“%20”。例如输入“We are happy.”,则输出“We%20are%20happy.”。 |
如果用java string类中提供的replace方法可以很快的进行替换。
代码实现:
package com.yyq; /** * Created by Administrator on 2015/9/4. */ public class ReplaceBlank { public static void main(String args[]){ String str = "we are happy"; String newStr = str.replace(" ","%20"); System.out.println(newStr); } }
如果是按照很原始的方法进行替换的话,里面包含着大技巧。
我们可以先遍历一次字符串,这样就能统计出字符串中空格的总数,并可以由此计算出替换之后的字符串的总长度。每替换一个空格,长度增加2,因此替换以后字符串的长度等于原来长度加上2乘以空格数目。从字符串的后面开始复制和替换,直到都走到字符串首位。
代码实现:
package com.yyq; import java.util.Arrays; /** * Created by Administrator on 2015/9/4. */ public class ReplaceBlank { private static int maxLength = 100; //length 为字符数组string的总容量,新增长的数组长度不能超过length public static void repalceBlank(String str, int trueLength, int maxLength) { if (str == null || maxLength <= 0) { return; } //如果是传统的静态数组,java中是不允许动态扩充的,如果需要扩充的话,则需要使用java自带的累积框架,如List char oldString[] = str.toCharArray(); int numberBlank = 0; int i = 0; while (i < trueLength) { if (oldString[i] == ' ') { numberBlank++; } i++; } int newLength = trueLength + numberBlank * 2; //新开辟一个数组 char newString[] = new char[newLength]; for (int j = 0; j < newLength; j++) { newString[j] = 0; } if (newLength > maxLength) { return; } int indexOld = trueLength - 1; int indexNew = newLength - 1; while (indexOld >= 0 && indexOld <= indexNew) { if (oldString[indexOld] == ' ') { newString[indexNew] = '0'; indexNew--; newString[indexNew] = '2'; indexNew--; newString[indexNew] = '%'; indexNew--; } else { newString[indexNew--] = oldString[indexOld]; } indexOld--; } System.out.println(new String(newString)); } public static void Test(String testName, String str) { if (str == null) return; if (testName != null) { System.out.println(testName + "======"); repalceBlank(str, str.length(), maxLength); } } // 空格在句子中间 public void Test1() { String str = "ab c"; Test("Test1(空格在句子中间)", str); } // 空格在句子开头 public void Test2() { String str = " helloworld"; Test("Test2(空格在句子开头)", str); } // 空格在句子末尾 public void Test3() { String str = "helloworld "; Test("Test3(空格在句子末尾)", str); } // 连续有两个空格 public void Test4() { String str = "hello world"; Test("Test4(连续有两个空格)", str); } // 传入NULL public void Test5() { Test("Test5(传入null)", null); } // 传入内容为空的字符串 public void Test6() { String str = ""; Test("Test6传入内容为空的字符串", str); } //传入内容为一个空格的字符串 public void Test7() { String str = " "; Test("Test7(传入内容为一个空格的字符串)", str); } // 传入的字符串没有空格 public void Test8() { String str = "helloworld"; Test("Test8(传入的字符串没有空格)", str); } // 传入的字符串全是空格 public void Test9() { String str = " "; Test("Test9(传入的字符串全是空格)", str); } public static void main(String[] args) { // TODO Auto-generated method stub ReplaceBlank test = new ReplaceBlank(); test.Test1(); test.Test2(); test.Test3(); test.Test4(); test.Test5(); test.Test6(); test.Test7(); test.Test8(); test.Test9(); } }
输出结果:
Test1(空格在句子中间)====== ab%20c Test2(空格在句子开头)====== %20helloworld Test3(空格在句子末尾)====== helloworld%20 Test4(连续有两个空格)====== hello%20%20world Test6传入内容为空的字符串====== Test7(传入内容为一个空格的字符串)====== %20 Test8(传入的字符串没有空格)====== helloworld Test9(传入的字符串全是空格)====== %20%20%20 |