目录
原题解:
力扣题解:
今天刷路径加密(替换空格),大家有兴趣可以点上看看题目要求,试着做一下。
我们直接看题解吧:
由于力扣题目与原题有点差异,力扣传入的是String,而原题这边传的是StringBuffer,所以这边以原题为主
方法:
第一个方法,创建新字符串
(剑指offer)第二个方法,原地更改
审题目+事例+提示:
原题中时将空格“ ”改为%20,这意味着每次需要增加两位
解题思路:
法1:
注意:
力扣的题目方法参数是String,而剑指offer原题是StringBuffer
循环,遇到‘.’(空格)就加空格“ ”(%20),否则就其他加字符。
代码(法1):
力扣:
class Solution {
public String pathEncryption(String path) {
//创建包装类数据引用,装字符串转为字符数组的地址
StringBuilder res = new StringBuilder();
//方法toCharArray()字符串转字符数组
for(Character c : path.toCharArray())
{//追加append()方法
if(c == '.') res.append(' ');
else res.append(c);
}
return res.toString();
}
}
原题:
public String replaceSpace(StringBuffer str) {
String res="";
for(int i=0;i<str.length();i++){
char c=str.charAt(i); //函数charAt:返回索引处的字符
if(c==' ')
res += "%20";
else
res += c;
}
return res;
}
优化1(利用三目运算):
class Solution {
public:
string replaceSpace(string s) {
string str;
for(int i = 0;i<s.size();i++){
s[i]==' '?str+="%20":str+=s[i];
}
return str;
}
};
优化2(利用replace()方法):
class Solution {
public String replaceSpace(String s) {
return s.replaceAll(" ","%20");
}
}
法2:
- 判断数组是否为空,是则返回null
- 循环统计一下空格数量
- 设置数组新长度,双指针,oldindex指向原数组末尾,newindex指向原数组+2*空数量
- 循环:
·若遇到空格,oldindex--,依次newindex--,填入%,2,0
·否则,将其他字符元素放入new指向的位置,之后old与new 递减
5.最后返回字符串
代码(法2):
public String replaceSpace(StringBuffer str) {
if(str==null)
return null;
int numOfblank = 0;//空格数量
int len=str.length();
for(int i=0;i<len;i++){ //计算空格数量
if(str.charAt(i)==' ')
numOfblank++;
}
//注意用了setLength()方法
str.setLength(len+2*numOfblank); //设置长度
int oldIndex=len-1; //两个指针
int newIndex=(len+2*numOfblank)-1;
while(oldIndex>=0 && newIndex>oldIndex){
char c=str.charAt(oldIndex);//转成字符
if(c==' '){
oldIndex--;
str.setCharAt(newIndex--,'0');//注意用了setChatAt方法
str.setCharAt(newIndex--,'2');
str.setCharAt(newIndex--,'%');
}else{
str.setCharAt(newIndex,c);
oldIndex--;
newIndex--;
}
}
return str.toString();
}
注:使用 了setLength()、setCharAt()方法