整体思路就是:

  1. 先将原始的 5 张牌进行排序(使用内置的排序O(nlongn))
  2. 然后,获取这 5 张牌当中 0 的个数(因为 0 可以变成任何数)。同时,在获取 0 的个数的过程中,还能判断这 5 张牌中是否有重复的数字(如果有重复的数字,那么这 5 张牌肯定不能组成顺子。注意:这里的重复数字,指除 0 外的任意数字)
  3. 接着,再遍历除 0 外的数字之间的间隔是多少(这里是想求出,如果我们需要将这除 0 外的数字组成顺子,一共需要多少张牌,而需要的这些牌,都可以由 0 变成)
  4. 最后,再判断。(这里有 2 种情况可以组成顺子)第一种,除 0 外的所有数字,本身就是连贯的;第二种,需要的 0 的个数等于原始的 5 张牌里面 0 的个数。
import java.util.*;

public class Solution {
    public boolean IsContinuous(int [] numbers) {

        // 排序
        Arrays.sort(numbers);
        int tmp = -1;
        int account = 0; // 定义一个整型变量,用于存放 0 的个数
        int num = 0; // 定义一个整型变量,用于存放需要 0 的个数
        for (int number : numbers) {
            if (number != 0) {
                if (tmp == number) {
                    return false;
                }
                tmp = number;
            } else {
                account++;
            }
        }
        for (int i = account + 1; i < numbers.length; i++) {
            num += (numbers[i] - numbers[i - 1] - 1);
        }
        return num == account || num == 0 ? true : false;
    }
}