写了一小时,具体思路如下:
确定下一张牌是哪张,for:1->9,构建出card数组表示每一张牌的数量,card[i]>4,直接跳过
确定雀头是哪一张:for:1->9,card[i]-=2;
剩下的牌组成顺子或者刻子,显然1张或者2张必定组成顺子,于是从小到大开始组牌,先从小到大去除顺子
当第i牌的前一张牌的数量为0,或者i==0,那么必定有一个顺子是以i开头,于是可以找出顺子,
如果不能组成顺子,那么只能组成刻子,这里要考虑4张了,4一张一般由一个刻子和一个顺子组成。具体代码:

package org.niuke.soltion65;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;

public class Main {
    /**
     * @param card 每张牌的数量
     * @return 是否能够胡牌
     */
    public static boolean just(int[] card){
        for(int i = 0; i < card.length; i++){
            int cnt = 14;
            if(card[i] >= 2){
                int[] temp = Arrays.copyOf(card, 9);
                temp[i] -= 2;//雀头(对子)
                cnt -= 2;
                //去除以 index为头的顺子,例如:3个1,以1作为雀头,这个1必定要组成顺子的。
                for(int k = 0; k < temp.length; k++){
                    if((k == 0 || temp[k - 1] == 0) && (temp[k] == 1 || temp[k] == 2)){ //只有1张或者两张必定组成顺子
                        if(removeABC(temp, k)){
                            cnt -= 3;
                            if(temp[k] == 1){
                                if(removeABC(temp, k)){
                                    cnt -= 3;
                                }else{
                                    break;
                                }
                            }
                        }else{
                            break;
                        }
                    }
                    //去除刻子
                    if(removeAAA(temp, k)){
                        cnt -= 3;
                        if(temp[k] == 1){
                            if(removeABC(temp, k)){
                                cnt -= 3;
                            }else{
                                break;
                            }
                        }
                    }
                }
                if(cnt == 0){
                    return true;
                }
            }
        }

        return false;
    }

    //去除一个从index开始的顺子
    public static boolean removeABC(int[] card, int index){
        if(index >= 0 && index + 2 < card.length && card[index] >= 1 && card[index + 1] >= 1 && card[index + 2] >= 1){
            card[index]--;
            card[index + 1]--;
            card[index + 2]--;
            return true;
        }
        return false;
    }

    //去除一个index+1的刻子
    public static boolean removeAAA(int[] card, int index){
        if(index >= 0 && index < card.length && card[index] >= 3){
            card[index] -= 3;
            return true;
        }
        return false;
    }


    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        int[] input = Arrays.stream(scanner.nextLine().split(" "))
                .mapToInt(Integer::parseInt).toArray();
        int[] card = new int[9];
        for(int i = 0; i < input.length; i++){
            card[input[i] - 1] += 1;
        }

        ArrayList<Integer> arr = new ArrayList<>();
        for(int i = 0; i < card.length; i++){
            int[] cardCopy = Arrays.copyOf(card, 9);
            cardCopy[i]++;
            if(cardCopy[i] <= 4 && just(cardCopy)){
                arr.add(i + 1);
            }
        }
        if(arr.isEmpty()){
            System.out.println("0");
        }else{
            for(int i = 0; i < arr.size() - 1; i++){
                System.out.print(arr.get(i) + " ");
            }
            System.out.println(arr.get(arr.size() - 1));
        }
    }
}