[デイリーブルーブリッジ] 23。4年間の地方Javaグループの本当の質問「ポーカーシーケンス」

こんにちは、私は小さな灰色の類人猿で、バグを書くことができるプログラマーです!

私のコラム「DailyBlueBridge」に注目してください。このコラムの主な機能は、近年のBlue Bridge Cupの地方大会と決勝戦の実際の質問を共有し、アルゴリズムのアイデア、データ構造、およびあなたが学ぶのを助けるためにそこに存在する他のコンテンツより多くの知識と技術に!

タイトル:ポーカーシーケンス

AA 2 2 3 3 4 4、合計4組のトランプ、並べてください、

要件:2つのエースの間に1枚のカード、2つの2の間に2枚のカード、2つの3の間に3枚のカード、2つの4の間に4枚のカードがあります。

要件を満たすすべての順列の中で辞書式順序が最小のものを入力してください。

例:22AA3344は辞書式順序でA2A23344よりも小さいです。もちろん、いずれも要件を満たしていません。

ブラウザから回答を送信してください。「A」に小文字のaを使用したり、代わりに「1」を使用したり、文字の間にスペースを入れたりしないでください。

問題解決のアイデア:

この質問の解決策では、順列と組み合わせのアイデアが主に調査されます.8つのトランプのすべての可能な結果を​​列挙するために順列と組み合わせが使用され、次に、組み合わせがで与えられた要件を満たしているかどうかが判断されますここで、最小の配置順序を出力する場合は、文字列のサイズを比較する必要があります。ここで使用されるメソッドは、compareToメソッドです。

aとbが2つの文字列であるとすると、aとbのサイズを比較する方法は次のとおりです。

a.compareTo(b)

a == bは0を返します

a> b戻り値が0より大きい

a <b戻り値が0未満

回答のソースコード:

package 一四年省赛真题;

import java.util.ArrayList;
import java.util.List;

/**标题:扑克序列
A A 2 2 3 3 4 4,一共四对扑克牌,请你把它们排成一行,
要求:两个A中间有一张牌,两个2之间有两张牌,两个3之间有三张牌,两个4之间有四张牌。
请填写出所有符合要求的排列中,字典序最小的那个。
例如:22AA3344比A2A23344字典序小,当然,它们都不是满足要求的答案。
请通过浏览器提交答案,“A”一定不要用小写字母a,也不要用“1”代替,字符间一定不要留空格。
*/
public class Year2014_Bt7 {
	
	static String minString = "AA223344";	//定义最小的字符串
	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		list.add("A");
		list.add("A");
		list.add("2");
		list.add("2");
		list.add("3");
		list.add("3");
		list.add("4");
		list.add("4");
		f(list,0);
		System.out.println(minString);
	}

	/**
	 * 列表元素的全排列
	 * */
	private static void f(List<String> list,int n) {
		if (n==list.size()) {
			if (check(list)) {
				String ansList = "";
				for (String string : list) {
					ansList+=string;
				}
				//判断当前的字符串是否小于新组成的字符串
				/**
				 * a.compareTo(b)方法
				 * a==b 返回0
				 * a>b 返回值大于0
				 * a<b 返回值小于0
				 * */
				if (minString.compareTo(ansList)>0) {
					minString=ansList;
				}
			}
		}
		for (int i = n; i < list.size(); i++) {
			String t = list.get(n);
			list.set(n, list.get(i));
			list.set(i, t);
			
			//递归确定下一个元素
			f(list, n+1);
			
			//回溯,返回原序列
			t = list.get(n);
			list.set(n, list.get(i));
			list.set(i, t);
		}
		
		
	}

	/**
	 * 检查组合是否符合要求
	 * */
	private static boolean check(List<String> list) {
		if (list.lastIndexOf("A")-list.indexOf("A")==2
				&&list.lastIndexOf("2")-list.indexOf("2")==3
				&&list.lastIndexOf("3")-list.indexOf("3")==4
				&&list.lastIndexOf("4")-list.indexOf("4")==5) {
			return true;
		}
		return false;
	}

}

 

 

サンプル出力:

欠点や改善点がありますので、友達にメッセージを残して一緒に学んでもらいたいです!

興味のある友達はコラムをフォローできます!

リトルグレイエイプは一緒に進歩するためにあなたに同行します!

おすすめ

転載: blog.csdn.net/weixin_44985880/article/details/113696817