请实现一个函数,将一个字符串中的每一个空格替换成“%20”。例如,当字符串为We Are Happy.则通过替换以后的字符串为We%20Are%20Happy。
注:用%20替换的缘由,空格在ASCII码中的序号为32,用十六进制表示为0x20。算法
参考剑指offer上的说明,须要考虑操做是原地(in place)操做仍是新建字符串操做。以原地操做为例,首先考虑最直观的方法-从前日后依次替换。在第一个空格处,空格替换为%20,空格以后的字符所有右移三个位置。同理,第一次移动后,向后遍历,在第二个空格处继续将后边字符移动。数组
从算法角度分析,设输入规模为n,咱们须要循环遍历字符串中空格(循环中,判断是否为空的操做执行n次),在每一个空格处,进行字符移动操做,每一个字符的移动又至关于一次循环。所以,总的运行效率为app
$$ O(n^2) $$函数
直接遍历移动的方法效率过低,所以,考虑其余方法。
方法1:
考虑比Sting高效的字符串操做工具-StringBuffer,一样使用以前的直接遍历的方法,可是对比发现,不须要重复移动,每次判断执行一次操做,共执行n此判断,效率为O(n)
方法2:
不使用StringBuffer,参考剑指offer书上的方法,在原字符串上进行操做,利用两条指针进行数据移动的思路,具体见方法2代码。(注意倒序复制提升效率的思路)工具
方法1源程序:测试
package jz_offer; public class problem04 { public static String spaceReplace(String str) { StringBuffer newStr=new StringBuffer(); int length=str.length(); //特殊状况, if(str==null) return null; for(int i=0;i<length;i++) { if(str.charAt(i)==' ') { newStr.append("%20"); }else { newStr.append(str.charAt(i)); } } return newStr.toString(); } public static void main(String[] args) { // TODO Auto-generated method stub //包含空格-:前-后-中-连续空格 String str1 = " Wearehappy"; String str2 = "Wearehappy "; String str3 = "We are happy"; String str4 = "We are happy "; //没有空格 String str5="Wearehappy"; //特殊输入测试:只有连续空格、只有一个空格、是null指针、是空字符串 String str6=" "; String str7=" "; //String str8=null; //会出现NullPointerException(运行时异常) String str8=""; String[] strArray=new String[] {str1,str2,str3,str4,str5, str6,str7,str8}; for(int i=0;i<strArray.length;i++) { System.out.println(spaceReplace(strArray[i])); } } }
(2019/2/17 增长)注:特殊状况下原条件为str==null||length==0,后者为空字符串,输出应仍为空字符。所以后者应舍去,不然OJ会不经过(牛客测试)。spa
方法2部分程序:指针
//二、使用临时字符数组 public static String spaceReplace2(String str) { int length=str.length(); int spaceCount=0; for(int i=0;i<length;i++) if(str.charAt(i)==' ') { spaceCount++; } int newLength=length+spaceCount*2; char[] newStrArray=new char[newLength]; //特殊状况 if(str==null) return null; int j=newLength-1; for(int i=length-1;i>=0;i--) { if(str.charAt(i)==' ') { newStrArray[j]='0'; newStrArray[j-1]='2'; newStrArray[j-2]='%'; j=j-3; } else { newStrArray[j]=str.charAt(i); j--; } } return new String(newStrArray); }