1

接頭辞である要素のセットがあります。入力を取得するたびに、それが属するプレフィックスを確認し、プレフィックスと一致する場合は true または false を返すように、Java メソッドを作成する必要があります。要素は

1900
1901
1902
1903
17082

入力は

1900123445
1901334455
1800777777
...

パフォーマンスに影響しないように使用できるデータ構造。一度に入力できる数字は5000万までなので。

誰でもこれで私を助けることができますか?前もって感謝します。

4

5 に答える 5

2

可能であれば、これらの方法をそれぞれテストして、状況に応じて最速の方法を確認してください。おそらくさまざまな要因に依存するため、特定のユースケースでどれが最適かを実際に予測することはできません.

オプション 0 (接頭辞がほとんどない場合に使用)

最も簡単なオプション: 接頭辞をリンクされたリストに保存し、 を使用してそれぞれをチェックしinput.startsWith(prefix)ます。つまらない。

オプション 1 (数字以外のプレフィックスがある場合に使用)

を最小kプレフィックス長とします。キーが各プレフィックスの最初の数字であり、アイテム各プレフィックスの残りを含むリンクされたリストHashMapであるa を使用します。k

たとえば、接頭辞abcdabce、およびがあるとしxyzます。次に、以下を保存します。

  • "abc"--> ("d","e")("d","e")要素を含むリンクされたリストであり"d""e"
  • "xyz"--> ("")(""空の文字列はどこにありますか)。

この mapprefixesを呼び出し、次のコードを使用してプレフィックスが正しいかどうかを判断します。

public boolean correctPrefix(String input){
    LinkedList check = prefix.get(input.substring(0,k))
    if (check != null){
        for (String n : check){
            if (input.substring(k).startsWith(check)) return true;
        }
    return false;
}

あなたの目的に十分な速さであるかどうかはわかりませんが、それらが何であるかを正確に教えてくれませんでした。それでも、 Java でより高速なものは知りません。

オプション 2 (すべてのプレフィックスが数値の場合、または SE7 を使用している場合はこれを使用します)

switchステートメントを使用します。むしろ、可能なプレフィックス長ごとに 1 つずつ、複数の switch ステートメントを使用します。たとえば、接頭辞19011902、およびがあるとし20050ます。

public boolean correctPrefix(String input){
    int pVal;
    pVal = Integer.parseInt(input.substring(0,4));
    switch (pval){
    case 1901: return true;
    case 1902: return true;
    }
    pVal = Integer.parseInt(input.substring(0,5));
    switch (pval){
    case 20050: return true;
    }
    return false;
}

これはより多くのコードになりますが、同じ長さのプレフィックスが十分にあると仮定すると、はるかに高速になると思います。switchステートメントに可能なケースがあまりない場合、実際には真のswitchステートメントとしてではなく、一連のif/elseブロックとしてコンパイルされるため、かなり遅くなることに注意してください。ただし、これをいじって、何が得られるかを確認する必要があります。case [wrongprefix]: return false;信じられないかもしれませんが、実際に物事をスピードアップできるので、いくつかの偽のステートメントを入れる価値があるかもしれません。

実際、SE7 の時点で、switch ステートメントは文字列で使用できます。これがどれほど効率的かはわかりませんが、オプションです。

または、SE7 より前のものを使用している場合は、試してみることができます....

オプション 3 (ごまかす方法)

実際には基数を に渡すことができparseIntます。つまり、プレフィックスに文字が含まれていても大文字と小文字が区別されない場合は、 を使用Integer.parseInt(input.substring(0,4),36)して有効な整数値を取得し、それを で使用できますswitch

于 2013-05-02T06:34:28.480 に答える
1

最善の策は、プレフィックスを HashMap に格納することであり、値はリンクされたリストにする必要があります。同じプレフィックスが 19011234 190123444 のようなさまざまな番号でタグ付けされる可能性があると想定しています。

于 2013-05-02T06:34:36.420 に答える
1

を作成し、HashSetこれらの 4 つの値を追加します。次に、入力値を解析して最初の 4 つの整数を取得し、HashSetcontains()メソッドを呼び出して true/false を返します。

于 2013-05-02T06:36:37.963 に答える