你好呀,我是灰小猿,一个超会写bug的程序猿!
欢迎大家关注我的专栏“每日蓝桥”,该专栏的主要作用是和大家分享近几年蓝桥杯省赛及决赛等真题,解析其中存在的算法思想、数据结构等内容,帮助大家学习到更多的知识和技术!
标题:扑克序列
A A 2 2 3 3 4 4,一共四对扑克牌,请你把它们排成一行,
要求:两个A中间有一张牌,两个2之间有两张牌,两个3之间有三张牌,两个4之间有四张牌。
请填写出所有符合要求的排列中,字典序最小的那个。
例如:22AA3344比A2A23344字典序小,当然,它们都不是满足要求的答案。
请通过浏览器提交答案,“A”一定不要用小写字母a,也不要用“1”代替,字符间一定不要留空格。
解题思路:
本题在求解上主要还是考察了排列组合的思想,利用排列组合将8张扑克牌所有的可能结果全都枚举出来,然后判断组合是否符合题目中所给的要求,在这里如果想要输出最小的排列顺序,那么是需要进行字符串的大小的比较的,这里采用的方法是compareTo方法。
设a,b是两个字符串,则对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; } }
输出样例: