题解 | #扑克牌顺子#
扑克牌顺子
http://www.nowcoder.com/practice/762836f4d43d43ca9deb273b3de8e1f4
整体思路就是:
- 先将原始的 5 张牌进行排序(使用内置的排序O(nlongn))
- 然后,获取这 5 张牌当中 0 的个数(因为 0 可以变成任何数)。同时,在获取 0 的个数的过程中,还能判断这 5 张牌中是否有重复的数字(如果有重复的数字,那么这 5 张牌肯定不能组成顺子。注意:这里的重复数字,指除 0 外的任意数字)
- 接着,再遍历除 0 外的数字之间的间隔是多少(这里是想求出,如果我们需要将这除 0 外的数字组成顺子,一共需要多少张牌,而需要的这些牌,都可以由 0 变成)
- 最后,再判断。(这里有 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;
}
}