题目
从扑克牌中随机抽取5张牌,判断是不是一个顺子,即这5张牌是不是连续的。
2-10为数字本身,A为1,J为11,Q为12,K为13,
而大、小王可以看成任意数字。
可以把扑克牌的背景抽象成计算机语音
接下来看一下解题思路:
思路:
可以把扑克牌看成由数字组成的数组,大、小王是特殊的数字,可以都看成是0.由于0可以看成是任意数字,所以可以用0去补满数组中的空缺,如果排序后的数组不是连续的,但只要有足够的0去补满这个空缺,那么这个数组实际上也可以看成是连续的。
所以只需要做三步:
1.把数组排序;
2.统计数组中0的个数;
3.统计数组中空缺总数;
如果0的个数大于等于空缺总数,就是顺子。
代码示例:
public boolean isContinuous(int [] numbers) {
if (numbers == null || numbers.length <= 0) {
return false;
}
//排序
Arrays.sort(numbers);
//0的个数
int numZero = 0;
//空缺总数
int numGap = 0;
//统计0的个数
for (int i = 0; i < numbers.length && numbers[i] == 0; i++) {
numZero++;
}
int small = numZero;
int big = small + 1;
while (big < numbers.length) {
//判断是不是对子
if (numbers[big] == numbers[small]) {
return false;
}
numGap += numbers[big] - numbers[small] - 1;
small = big;
big++;
}
return (numZero >= numGap);
}
总结
这里需要注意的是
因为用到了排序算法,所以时间复杂度取决于排序算法的时间复杂度。这里用的是快排,所以时间复杂度是O(nlogn)。