这题太***了
有13张牌
然后从1到9 添加没有 出现四次的
变成14张的完全手牌
然后判断 该手牌能否hu
能hu 就讲该数字添加到res中

calculate 用来寻找14张牌能否胡

isFindQue 递归寻找 在找到雀头的情况下,剩下的牌能够hu

传递数组列表时应该注意是否接下来的操作会改变数组, 如果改变 最好申请新的空间

import java.util.Scanner;
import java.util.*;


public class Main{
    public static void main(String[] args) {
        int [] input = new int[14];
        int [] num = new int[10];
        Scanner sc = new Scanner(System.in);
        for(int i=0 ;i<13; i++){
            int in = sc.nextInt();
            num[in]++;
            input[i] = in;
        }
        //初始化完毕

        ArrayList<Integer> res =new ArrayList<>();

        for(int i=1;i<10;i++){
            if(num[i]!=4) {
                input[13] = i;
                if(calculate(input)) res.add(i);
            }
        }
        //开始打印结果
        if(res.isEmpty()) System.out.println(0);
        else{
            String out = "";
            for( int dig:res){
                out = out + String.valueOf(dig) + ' ';
            }
            System.out.println(out.substring(0,out.length()-1));

        }

    }
    public static boolean calculate(int[] inputs){
        //寻找雀头
        // 要重新定义 in 否则排序会把原有的顺序打乱, 比如添加2 2在原有数组中跑到前面去了 后面添加 input[13]就会出错;
        int[] in = new int[inputs.length];
        for (int i=0;i<in.length;i++){
            in[i] = inputs[i];
        }
        Arrays.sort(in);
        ArrayList<Integer> input = new ArrayList<Integer>();
        for(int num:in){
            input.add(num);
        }
        int i=1; //1-13寻找雀头
        while(i<14){
            //寻找到一组雀头
            if(in[i] == in[i-1]){
                int temp = input.get(i-1);
                input.remove(i-1);
                input.remove(i-1);
                if(isFindQue(input)) return true;
                input.add(i-1,temp);
                input.add(i-1,temp);
            }
            i++;
        }
        return false;

    }
    public static boolean isFindQue(ArrayList<Integer> in){
        if(in.size()<3) return true;

        //是否有三个一样的
        if(in.get(0) == in.get(1) && in.get(1) == in.get(2)){
            ArrayList<Integer> temp = new ArrayList<Integer>(in);
            temp.remove(0);temp.remove(0);temp.remove(0);
            return isFindQue(temp);
        }
        else {
            //是否有三个连起来的
            // a,b,c分别记录下标 连续三个不同值的下标
            int i= 1,a =0;
            while(in.get(i)==in.get(a)) i++;
            int b =i;
            while(i<in.size()-1 && in.get(i)==in.get(b)) i++;
            int c =i;
            if(in.get(c)-in.get(b) == 1 && in.get(b)-in.get(a)==1){
                ArrayList<Integer> temp = new ArrayList<Integer>(in);
                temp.remove(a);temp.remove(b-1);temp.remove(c-2);
                return isFindQue(temp);
            }
            // 没有三个一样的 也没有三个连起来的 就不能和
            else return false;
        }
    }
}