04.スペースの置き換え---『剣指Offer』(Java版)
これを注文する
1つの文字列の各スペースを「%20」に置き換える関数を実装してください.例えば、文字列がWe Are Happyである.置換後の文字列は、We%20 Are%20 Happyである.
Java言語にあまり詳しくない学生はStringを使うかもしれませんが、Stringは可変ではないため、+-操作を行うたびにStringが新しく生成され、空間と時間の二重の浪費をもたらします.Javaはこの場合StringBuilderクラスを使用してappend()操作を継続することを提案する.
public String replaceSpace(StringBuffer str) {
if(str == null){
return null;
}
// char[], , [] charAt
char[] s = str.toString().toCharArray();
StringBuffer res = new StringBuffer();
// forEach, foreach , 。
for (int i = 0; i < s.length; i++) {
if(s[i] == ' '){
res.append("%20");
}else {
res.append(s[i]);
}
}
return res.toString();
}
C/C++については考慮すべきことが多いが、Javaは造ったホイールStringBuilderをそのまま使えばよい.
しかし、作者はchar配列を意味していたので、私もchar配列を使ってみました.
public String replaceSpaceByCharArr(String str) {
if (str == null) {
return null;
}
char[] s = str.toCharArray();
// , +count(' ')*2
int countSpace = count(s, ' ');
//
char[] resArr = new char[s.length + 2 * countSpace];
for (int i = 0, j = 0; i < s.length; i++, j++) {
if (s[i] == ' ') {
resArr[j++] = '%';
resArr[j++] = '2';
resArr[j] = '0';
} else {
resArr[j] = s[i];
}
}
// Char String
return new String(resArr);
}
/**
* char ,target
*/
private int count(char[] s, char target) {
int res = 0;
for (char c : s) {
if (target == c) {
res++;
}
}
return res;
}
すべてのコードは次のとおりです.
/**
* :
* “%20”。
*
*
* We Are Happy.
* We%20Are%20Happy。
*/
public class _004_replaceSpace {
/**
* , String, 。
* String ,"+" String , 。
* :"Login" + "Username" ---> 3 String, "Login","Username","LoginUsername"
* .
*
* ,
* :StringBuilder;
* :StringBuffer
*/
public String replaceSpaceByStringBuilder(String str) {
if (str == null) {
return null;
}
// char[],char[] , char[] ,
//
char[] s = str.toCharArray();
StringBuffer res = new StringBuffer();
// foreach 。
for (char c : s) {
// , res "%20", String str+="%20" 。
if (c == ' ') {
res.append("%20");
} else {
// ,
res.append(c);
}
}
// StringBuilder String,
return res.toString();
}
/**
* Offer char[], 。
*
* , .
*/
public String replaceSpaceByCharArr(String str) {
if (str == null) {
return null;
}
char[] s = str.toCharArray();
// , +count(' ')*2
int countSpace = count(s, ' ');
//
char[] resArr = new char[s.length + 2 * countSpace];
for (int i = 0, j = 0; i < s.length; i++, j++) {
if (s[i] == ' ') {
resArr[j++] = '%';
resArr[j++] = '2';
resArr[j] = '0';
} else {
resArr[j] = s[i];
}
}
// Char String
return new String(resArr);
}
/**
* char ,target
*/
private int count(char[] s, char target) {
int res = 0;
for (char c : s) {
if (target == c) {
res++;
}
}
return res;
}
}