ペアに基づいてカードを並べ替える並べ替えアルゴリズムを作成する必要があるため、たとえば、4JJQQ がある場合、QQJJ4 を並べ替える必要があります。さまざまな方法を試しましたが、正しい順序にするのが難しいようです。私は基本的に、そのハンドを含む一連のカードを持っています。
2 に答える
問題はまだ少しわかりません。したがって、いくつかの仮定を立てますが、間違っている場合は修正してください。
主な問題が基本的に J などのリテラルと 4 などの数字を比較することである場合は、Counting Sortが解決策です。
概要 : 並べ替えられる値が限られている状況で適用される並べ替えアルゴリズムです。すべての可能な値のテーブルを作成し、スイープで、テーブルのそれぞれの行で同じ値を更新する各リテラルのすべての出現をカウントします。次に、これを使用して元の配列を好みの順序でソートするだけです。
利点: ソートのカウントは、Merge や Quicksort などの他の一般的なアルゴリズムよりも高速なアルゴリズムです (平均で O(n) 時間かかります)。可能な値が限られている場合は、それを使用すると言います。
ここで、「ペア」でソートする部分が来ますが、これは私にはよくわかりません。次のテストケース「JJQJ4」と「JQ329」で予想される答えを教えてください。
典型的なカウンティング ソートでは、これらをQJJJ4およびQJ932としてソートできます(ここではペアの概念はありません)。
回答パターンが[Pairs][Singular]で、それぞれが降順で並べ替えられている場合、最初に偶数枚のカードが読み込まれるようにカウントの並べ替えを変更するだけで済みます。任意のリテラルに残っている使用可能なカードが 1 または 0 の場合、最後にそれらを設定します。そうすれば、私のテストケースへの答えは
JJQJ4およびQJ923。
また、両方のテストケースも同様に適合しているようです。
別:
ペアであることが明らかな場合、両方のリテラルを比較する必要はありません。リテラルのツリーのようなストレージを使用することをお勧めします。したがって、アイデアは、2 つの子を持つ中央のプレーヤー ノードを持つことです。左の子はペアの出現を保存し、右の子は特異なものを保存します。
リテラルの格納は、バイナリ ツリー形式で行われます。リテラルの挿入が変更されます。
45JJQを獲得すると、
1) 入力: 4 . 処理:プレイヤーノードのrChldとして4を格納
2) 入力: 5 . 処理: 5 を 4 の rChld として保存
3) 入力: J . プロセス: J を 5 の rChld として格納
4) 入力: J . 処理: J がもう 1 つあるので、5->rChld:NULL。J はプレーヤー ノードの lChld として格納されます (ここでもバイナリ ツリー形式で、つまり、lChld [Two Pairs] に既にリテラルが存在する場合、J はそのリテラルの左または右の子として格納されます。大きいか小さい)。
5) 入力: Q . プロセス: Q を 5 の rChld として保存
2 つの手を比較するには、最初にペアで最も高いカードを検索します (一番右の子には子がありません)。ペアの数も簡単に数えることができます。一般的なバイナリ ツリーでは、BFS または DFS が必要になります。ただし、最大 2 ペアしか持てないため、簡単に行うことができます。lChld が null の場合は、rChild で特異なカードを持つ上位のカードを再度検索します。
注: 実際にポーカーに似たゲームを作成している場合は、スリー オブ ア カインドのようなものも必要になるかもしれません。これは、プレーヤー ノードの左側の子ノードに「重み」を格納することで、ノードに格納できます。つまり、J が 2 回発生した場合、重みは 2 になり、3 回発生した場合、重みは 3 になります。重みよりも良い方法は、二項ヒープを使用することです。
TYPE = {A,K,Q,J,A,10..2}の場合 (おそらくJava のenum
場合) A > K > Q > J > 10 > ... > 2
次に、これはそれを行います:
class Card implements Comparable<Card> {
public TYPE ty;
public Card(TYPE t) {
ty = t;
}
public int compareTo(Card card) {
return card.ty - ty; //you should rewrite this according to [1] rules
}
}
並べ替え:
Collections.sort(listOfCards); where listOfCards is a List<Card>.