序文
文字列置換の場合、replace
メソッドとreplaceAll
メソッドは最も一般的に使用される解決策ですが、文字列置換を手動で処理するように求められたらどうしますか?
《剑指Offer》
その05题
1 つがこれです。
このメソッドを使用する場合、replace
処理するコードは 1 行です
class Solution {
public String replaceSpace(String s) {
return s.replace(" ","%20");
}
}
自分で実装するとしたら、次のようになります代码如下
。
class Solution {
public String replaceSpace(String s) {
byte[] cs = s.getBytes();
byte[] addByte = "%20".getBytes();
int addIndex = 0;
for (int i = 0; i < cs.length; i++) {
if (cs[i] == 32){
addIndex = addIndex + (addByte.length-1);
}
}
char[] c = new char[cs.length+addIndex];
int f = 0;
for (int i = 0; i < c.length; i++) {
if (cs[f] == 32){
for (int j = 0; j < addByte.length; j++) {
c[i+j] = (char) addByte[j];
}
i = i+(addByte.length-1);
}else{
c[i] = (char) cs[f];
}
f++;
}
return new String(c);
}
}
結果:
分析する
上記のコードは複雑さの点であまり最適化されていません. あくまで最初の検討でそれを実現する方法にすぎません. 次に、文字列を置換するアイデアを分析してみましょう。
まず、文字列は文字配列で構成されます。つまりchar[]
、文字列を“We are happy.”
例にとると、その構造は次のようになります。
文字列中にスペースを含む文字があり13
、スペースはスペース文字を置き換える配列の長さを増やす必要があることchar
を意味します。1 文字が 3 文字になる場合は、元の文字に 2 文字を追加する必要がありますlength. 2 つのスペースが 4 つである場合、構造は次のようになります。32
%20
char
char数组
したがって、計算する必要がある 4 つの長さは次のとおりです。
- 元の文字列の長さ
- 置換文字列の長さ
- 置換された文字列の長さ
- 新しい文字列の長さ
最初の 3 つは直接取得できますが、4 番目は計算する必要があります。計算式は次のとおりです。
原始字符串长度 + (被替换字符串长度 - 替换字符串长度) * 替换字符串数量
上記の文字列を使用して数式を計算します。13 + (3 - 1) * 2 = 17
結果は17
上の画像の長さと一致します。
コード
置換文字列はスペースであることがわかっているため、固定1
ビット文字であるため、上記 4 つの長さのうち 3 つを取得でき、置換文字の桁数も 1 回計算する必要があります。
コードは以下のように表示されます。
public String replaceSpace(String s) {
// 获取原始字符串长度
byte[] sb = s.getBytes();
// 获取替换字符串长度
byte[] addByte = "%20".getBytes();
// 计算被替换字符串出现次数
int addIndex = 0;
for (int i = 0; i < sb.length; i++) {
if (sb[i] == 32){
addIndex++;
}
}
// 计算新字符串长度
char[] c = new char[sb.length+(addByte.length-1)*addIndex];
}
これら 4 つの値が取得された後、新しい文字列配列の内容を埋めることになります。これには、カウント原始字符串
と遍历位数
レコードが必要です新字符串
。置換文字列が見つかった場合遍历位数
は+ 、それ以外の場合は、置換文字列が見つかった場合は+です。新字符串长度>旧字符串长度
新字符串
遍历位数
(被替换字符串长度 - 替换字符串长度)
新字符串长度<旧字符串长度
旧字符串
遍历位数
(被替换字符串长度 - 替换字符串长度)
%20 > ''
新しい文字列 + の走査桁は次のとおりです(被替换字符串长度 - 替换字符串长度)
。コードは次のとおりです。
public String replaceSpace(String s) {
// 获取原始字符串长度
byte[] sb = s.getBytes();
// 获取替换字符串长度
byte[] addByte = "%20".getBytes();
// 计算被替换字符串出现次数
int addIndex = 0;
for (int i = 0; i < sb.length; i++) {
if (sb[i] == 32){
addIndex++;
}
}
// 计算新字符串长度
char[] c = new char[sb.length+(addByte.length-1)*addIndex];
// 记录旧字符串遍历位数
int f = 0;
// 循环新字符串
for (int i = 0; i < c.length; i++) {
if (sb[f] == 32){
for (int j = 0; j < addByte.length; j++) {
c[i+j] = (char) addByte[j];
}
// 遇到替换字符串新字符遍历位数跳过(被替换字符串长度 - 替换字符串长度)
i = i+(addByte.length-1);
}else{
c[i] = (char) sb[f];
}
f++;
}
return new String(c);
}
上式に従い、1
空文字列条件を32
置換後の文字列の長さで置換判定し、char值
複数の文字列や標準文字列を使用することができます。