文字列offer5-安全性を証明するために、

タイトル

置き換える文字列にスペース%20 

思考

 1.まず、もちろん、あなたがスペースが発生した場合は、新しい文字列にアドオン「%20」を追加し、フロント、バックには、最も可能性の高い新しい文字列を考えることです。あなたは、通常の文字を打つ場合は、通常の文字に格納されます。(タイトルは新しい文字列を作成することを可能にする場合です)

2.(文字列は新しい文字列の後ろに許可されますが、元の文字列に置換される必要がありますが、入力に十分な空きメモリがあることを確認していない場合)、次に最も簡単な方法は、前面から背面にあるが、スペース文字を打ちます交換したときに交換が3文字の文字列であるので、それはまた、二つの文字列の後ろの最初の移動バックする必要があり、その後、挿入します。しかし、この場合には、各スペースのため、末尾のスペースはO(n)の文字がO(n)の空白文字を含む文字列のため、時間の複雑さはO(N ^ 2)で、いったん後退しています。

3.このような質問への回答は最高でなければなりません前に交換用バック。再び文字列を横断するため、元の文字列の文字数の増加をもたらし、スペースの数をカウントし、その後に交換することができます。前進P1とポインタ位置P2を置換する文字をコピーするP2点の後、元の文字列、文字列の末尾の端部に二つのポインタ、P1点を提供する、P2はまた、その後、前方ので、もし交換スペースを移動させますP2で「20%」を付加され、P2ポインタが(注逆順)しながら前方に移動し続けます

ソリューション

    パブリック 静的 ボイドreplaceSpace(StringBufferのSTR){
         int型 P1 = str.length() - 1 ;
        以下のためにINT iが= 0 ; I <= P1; I ++ ){
             場合(str.charAt(I)== '  ' ){ 
                str.append("   " )。
            } 
        } 
        int型 P2 = str.length() - 1 ;
        一方、(P1> = 0 && P2> P1){
             チャー C = str.charAt(P1-- )。
            もし(C == " ' ){ 
                str.setCharAt(P2 - 、' 0 ' )。
                str.setCharAt(P2 - 、' 2 ' )。
                str.setCharAt(P2 - 、' ' ); 
            } 
            { 
                str.setCharAt(P2 - 、C)。
            } 
        } 
        システム。うちの.print(STR); 
    }

 

 

タイトル 

2ソートされた配列A1とA2がありますが、メモリの最後にA1はA2を収容するのに十分な空きスペースがあります。すべての数字A2、A1を挿入する関数を記述し、すべての数字が並べ替えられています。

思考

それは、配列を命じているので問題に関する政策的含意は、この質問は、A1(A1が配列である配列の最後の位置に、配列の比較の最後の桁にその長さの大きい番号を続け、その後、戻ってからでなければなりませんNUM1と長さのNUM2和)を加えました。

ことに留意すべき2つの配列の長さの矛盾は、残りの部分を処理するために覚えています。アレイは、配列の新しい部分に付加されていない場合、アレイを次いで添加されていないアレイの他の部分に直接添加し、追加が完了したことを示す、0です。

ソリューション

    パブリック 静的 ボイド replaceSpace2(INT [] NUM1、INT [] NUM2、INT長さ1、INT LENGTH2){
         // INT LEN1 = num1.length-1。
        // int型LEN2 = num2.length-1; 
        int型 LEN1 = length1- 1 int型 LEN2 = length2- 1 int型 mergeLen =長さ1 + length2- 1 一方(LEN1> = 0 && LEN2> = 0 ){
             場合(NUM1 [LEN1]> NUM2 [LEN2]){ 
                NUM1 [mergeLen] =NUM1 [LEN1] 
                LEN1 - ; 
                mergeLen - ; 
            } 
            そうで あれば(NUM1 [LEN1 < NUM2 [LEN2]){             
                NUM1 [mergeLen] = NUM2 [LEN2] 
                LEN2 - ; 
                mergeLen - ; 
            } 
            エルス{ 
                NUM1 [mergeLen - ] = NUM1 [len1-- ] 
                NUM1 [mergeLen - ] = NUM2 [len2-- ] 
            } 
        } 
        ながら(LEN1> = 0 ){
            NUM1 [mergeLen- ] = NUM1 [len1-- ]。
        } 
        一方(LEN2> = 0 ){ 
            NUM1 [mergeLen - ] = NUM2 [len2-- ]。
        } 
        システム。うちの.print(NUM1)。
    }

 

拡張--StringBufferクラスとStringBuilderクラス

ストリングクラスには、その値を変更することはできません(割り当ての開始時にオープンスペースに定数プールの内容を変更することはできません)作成された文字列オブジェクト一旦修正することができません。ときに文字列改変、およびStringBufferのクラスStringBuilderクラスを使用する必要があり、2を繰り返し修正することができるオブジェクトの種類、および新しい未使用のオブジェクト。

StringBuilderとStringBufferのStringBuilderの方法との最大の違いはスレッドセーフではありません(アクセスを同期することはできません)です。あるのでしかし、StringBufferのStringBuilderのは、速度の利点に比べので、ほとんどの場合、私たちはStringBuilderクラスを使用することをお勧めしますただし、アプリケーションでケーススレッドセーフを必要とし、あなたはStringBufferクラスを使用する必要があります

一般的な方法:

// StringBufferのの
公共のStringBuffer()// 引数なしのコンストラクタ
公共のStringBuffer(int型の容量)// 指定されたターゲット文字列バッファ容量
公共のStringBuffer(文字列STR)// 文字列バッファが指定された文字列のコンテンツオブジェクト
のパブリック INSERTを(int型は、オフセットINT I)// このシーケンスに引数文字列のint型の表現を
パブリック(削除int型 [スタート]、int型エンド)// にストリング内の文字のこの配列を除去 
置き換え(int型 [スタート]、int型エンド、文字列STR)// 文字のこのシーケンスの文字の置き換えの指定された文字列サブ

//Stringクラス及びメソッド同様の
公共 int型の容量()//の電流容量、理論値返し
公共 int型の長さを()// 長(文字数)の実際の値を返し
チャーのcharAt(int型のインデックス)//が指定したシーケンスインデックスを返しで、char値
int型のindexOf(String str)文字// 文字列が最初に出現する位置のインデックスサブストリングを返す
のボイドはsetLength(int型 newLengthを)// 提供長文字列 
のサブストリング(文字列INT スタート)を返しますが現在に含まれる文字のこの一連の文字サブシーケンスが含まれた新しいString、
 無効 setCharAt(int型のインデックス、char型の CH)// 指定されたインデックス位置の文字がCHに設定されている 
)(文字列のtoString// データ系列の文字列表現を返します。

おすすめ

転載: www.cnblogs.com/lyeeer/p/12194108.html