扑克排序
标题:扑克序列
A A 2 2 3 3 4 4, 一共4对扑克牌。请你把它们排成一行。
要求:两个A中间有1张牌,两个2之间有2张牌,两个3之间有3张牌,两个4之间有4张牌。
请填写出所有符合要求的排列中,字典序最小的那个。
例如:22AA3344 比 A2A23344 字典序小。当然,它们都不是满足要求的答案。
解析
全排列+去重
通过全排列得到所以8张牌的序列可能,然后check()保证符合要求,通过Set的不重复特性减少运算量,因为得到的结果应该比较少,所以我们可以得到所有情况后,自己肉眼得到答案,不必非得用代码得到答案。
package com.blueBrageCup.B2014;
/**
* @auther thk
* @date 2021/2/2 - 10:21
*/
import javax.lang.model.type.ArrayType;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
public class T7扑克排序 {
private static char[] chars = new char[]{'A','A','2','2','3','3','4','4'};
private static Set<String> set = new HashSet<>();
private static String ArrayToString(){
StringBuffer buffer = new StringBuffer("");
for(int i=0;i<8;i++){
buffer.append(chars[i]);
}
return buffer.toString();
}
private static boolean check() {
String s = ArrayToString();
if((s.lastIndexOf('A')-s.indexOf('A'))==2 &&
(s.lastIndexOf('2')-s.indexOf('2'))==3 &&
(s.lastIndexOf('3')-s.indexOf('3'))==4 &&
(s.lastIndexOf('4')-s.indexOf('4'))==5)
return true;
return false;
}
private static void f(int k){
if(k==8){
String s = ArrayToString();
if(set.contains(s))
return;
set.add(s);
if(check()){
System.out.println(chars);
}
}
for(int i=k;i<8;i++){
char temp = chars[k];
chars[k] = chars[i];
chars[i]=temp;
f(k+1);
temp = chars[k];
chars[k] = chars[i];
chars[i]=temp;
}
}
public static void main(String[] args) {
f(0);
}
}