题目:请实现一个函数,把字符串中的每个空格替换成“%20”。例如,输入“We are happy.”,则输出“We%20are%20happy.”。
这题思路也很清晰,字符串,字符数组,或者其他的数组,涉及到大量移动的时候就从屁股开始
牛客练习连接:替换空格
代码如下:
public
class
Solution {
public
String
replaceSpace(
StringBuffer
str) {
if(str
==
null
|| str.
length()
==
0){
return str.
toString();
}
int originalLength
= str.
length();
int numberOfBank
=
0;
for(
int i
=
0;i
<originalLength;i
++){
if(str.
charAt(i)
==
' '){
numberOfBank
++;
}
}
int newLength
= originalLength
+numberOfBank
*
2;
str.
setLength(newLength);
//这里需要重新设置StringBuffer的长度,不然会报越界异常
int p1
= originalLength
-
1;
int p2
= newLength
-
1;
while(p1
>=
0
&& p2
>p1){
if(str.
charAt(p1)
!=
' '){
str.
setCharAt(p2
--, str.
charAt(p1));
}
else{
str.
setCharAt(p2
--,
'0');
str.
setCharAt(p2
--,
'2');
str.
setCharAt(p2
--,
'%');
}
p1
--;
}
return str.
toString();
}
}
此题拓展:有两个排序的数组A1和A2,内存在A1的末尾有足够多的空余空间容纳A2。请实现一个函数,把A2中所有数字插入A1中,并且所有的数字是排序的。
就是一次归并排序,思路一样的,从屁股开始,从A1和A2的屁股取出两个数比较,大的放到A1的后面,然后重复这个动作,如果A2先放完,结束;如果A1先放完,则把A2剩下的逐个放到A1中。
leetcode练习地址:88. Merge Sorted Array
代码如下:
public
class
Solution{
public
void
merge(
int[]
A1,
int[]
A2){
int i
= A1.length
-
1;
int j
= A2.length
-
1;
int length
= i
+j
+
1;
while(i
>=
0
&& j
>=
0){
if(
A1[i]
<
A2[j]){
A1[length
--]
=
A2[j];
j
--;
}
else{
A1[length
--]
=
A1[i];
i
--;
}
}
while(j
>=
0){
A1[length
--]
=
A2[j];
j
--;
}
}
}
两个while也可以简写为:
while(i
>=
0
&& j
>=
0)
A1[length
--]
=(
A1[i]
>
A2[j])
?
A1[i
--]
:
A2[j
--];
while(j
>=
0)
A1[length
--]
=
A2[j
--];
直接贴的VSCode里面自己写的代码,彩色比较炫