题目描述
从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10 为数字本身,A为1, J为11, Q为12,K为13,而大、小王可以看成任意数字。
思路分析
将问题转化为 判断5个数字是不是连续的,要注意其中大小王用0代替,最直观的方法是把数组排序。由于0(大小王)可以当成任意数字,我们可以用0去补满数组中的空缺。如果排序之后的数组不是连续的,即相邻的两个数字相隔若干个数字,那么只要我们有足够的0可以补满这两个数字的空缺,这个数组实际上还是连续的。举个例子,数组排序之后为{0,1,3,4,5},在1和3之间空缺了一个2,刚好我们有一个0,也就是我们可以把它当成2去填补这个空缺。
测试用例
- 功能测试:抽出的牌中有一个或者多个大、小王;抽出的牌中没有大、小王:抽出的牌中有对子。
- 特殊输入测试:输入nullptr指针。
Java代码
public class Offer061 {
public static void main(String[] args) {
test1();
test2();
test3();
}
public static boolean isContinuous(int[] numbers) {
return Solution1(numbers);
}
private static boolean Solution1(int[] numbers) {
if (numbers == null || numbers.length <= 0)
return false;
Arrays.sort(numbers);
int numberOf0 = 0;
int numberOfGap = 0;
for (int i = 0; i < numbers.length; i++) {
if (numbers[i] == 0)
numberOf0++;
}
int small = numberOf0;
int big = numberOf0 + 1;
while (big < numbers.length) {
if (numbers[small] == numbers[big])
return false;
numberOfGap += numbers[big++] - numbers[small++] - 1;
}
if (numberOf0 >= numberOfGap)
return true;
return false;
}
private static void test1() {
}
private static void test2() {
}
private static void test3() {
}
}