字符串编程题01

tech2025-05-31  11

1 题目

leetcode 请实现一个函数,把字符串中的每个空格替换成“%20”。例如,输入“We are happy.” ,则输出"We%20are%20happy."。

2 题解

2.1 循环替换

新建一个StringBuffer对象,遍历该字符串,遍历到非空格就直接添加,遍历到一个空格就替换,最后将该StringBuffer转换成String并返回

class Solution { public String replaceSpace(String s) { if(s==null || s.length()==0) return s; StringBuffer newS=new StringBuffer(); for(int i=0;i<s.length();i++) { if(s.charAt(i)==' ') { newS.append("%20"); }else { newS.append(s.charAt(i)); } } return newS.toString(); } }

运行通过

2.2 一次替换一段字符

上面的方法每找到一个非字符串就替换,尝试一次替换一段字符串

class Solution { public String replaceSpace(String s) { if(s==null || s.length()==0) return s; StringBuffer newS=new StringBuffer(); int flag=-1; for(int i=0;i<s.length();i++) { if(s.charAt(i)==' ') { if(flag==-1) { newS.append(s.substring(0, i)); newS.append("%20"); }else { newS.append(s.substring(flag+1,i)); newS.append("%20"); } flag=i; } } if(flag==-1) { return s; } if(flag<s.length()-1) { newS.append(s.substring(flag+1,s.length())); } return newS.toString(); } }

这方法是我舍友提出来的,我一开始没想到。

3 全解题解

全解上通过新建另一个字符数组来储存,统计字符串中的空格数,得出新字符数组的长度,使用两个指针从后向前遍历数组。

if(s==null || s.length()==0) { return s; } int OriginPoint=s.length()-1; StringBuffer sb=new StringBuffer(s); for(int i=0;i<=OriginPoint;i++) { if(s.charAt(i)==' ') { //空格,加两个长度 sb.append(" "); } } int newPoint=sb.length(); while(OriginPoint>=0) { if(s.charAt(OriginPoint)==' ') { //替换 sb.setCharAt(--newPoint, '0'); sb.setCharAt(--newPoint, '2'); sb.setCharAt(--newPoint, '%'); }else { sb.setCharAt(--newPoint, s.charAt(OriginPoint)); } OriginPoint--; } return sb.toString();

上面是我自己实现的,下面是全解的实现

public String replaceSpace(StringBuffer str) { int P1 = str.length() - 1; for (int i = 0; i <= P1; i++) if (str.charAt(i) == ' ') str.append(" "); int P2 = str.length() - 1; while (P1 >= 0 && P2 > P1) { char c = str.charAt(P1--); if (c == ' ') { str.setCharAt(P2--, '0'); str.setCharAt(P2--, '2'); str.setCharAt(P2--, '%'); } else { str.setCharAt(P2--, c); } } return str.toString(); }

while循环的P2>P1可以提前结束循环,当两个指针重合的时候,意味着前面已经没有空格了。

4 参考链接

1.官解 2.剑指 Offer 全解(Java 版)

最新回复(0)