题目描述:
现在有2副扑克牌,从扑克牌中随机五张扑克牌,我们需要来判断一下是不是顺子。有如下规则:
1.A为1,J为11,Q为12,K为13,A不能视为14;
2.大、小王为 0,0可以看作任意牌;
3.如果给出的五张牌能组成顺子(即这五张牌是连续的)就输出true,否则就输出false。
例如:给出数据[6,0,2,0,4],中间的两个0一个看作3,一个看作5 。即:[6,3,2,5,4],这样这五张牌在[2,6]区间连续,输出true。数据保证每组5个数字,每组最多含有4个零,数组的数取值为 [0, 13]。
示例:
示例1
输入:[6,0,2,0,4]
返回值:true
示例2
输入:[0,3,2,6,4]
返回值:true
示例3
输入:[1,0,0,1,0]
返回值:false
示例4
输入:[13,12,11,0,1]
返回值:false
方法一:
分析:1.先对数组排序;2.统计数组中0的个数;3.统计数组中空缺的个数,如果空缺的个数小于等于0的个数,返回true;如果空缺的个数大于0的个数,返回false。
有的人可能会担心对数组排序的时间复杂度为O(nlogn)O(nlogn)O(nlogn),还不够快,而且本题还可以采用哈希表,哈希表的时间复杂度为O(n)O(n)O(n),所以认为这种排序的方法不是最优的。但实际上,时间复杂度只有当nnn足够大时才有意义,而本题中数组的长度是固定的(长度为5),所以两个时间复杂度O(nlogn)O(nlogn)O(nlogn)和O(n)O(n)O(n)不会有多少区别,而且排序的方法更容易理解,所以选择此方法来实现算法。
import java.util.*;
public class Solution {
public boolean IsContinuous(int [] numbers) {
int numberOfZero = 0;
int numberOfGap = 0;
Arrays.sort(numbers); // 排序
for (int i : numbers) {
if (i == 0) {
numberOfZero++;
}
}
int start = numberOfZero;
int end = start + 1;
while (end < numbers.length) {
if (numbers[start] == numbers[end]) {
return false; // 有对子,一定不连续,返回false
}
numberOfGap += numbers[end] - numbers[start] - 1;
start++;
end++;
}
return (numberOfGap > numberOfZero) ? false : true;
}
}
时间复杂度:由于数组的长度为定值5,所以时间复杂度为O(1)O(1)O(1);空间复杂度:O(1)O(1)O(1)。
结束语:如果本篇博客对您有帮助,请点赞、收藏或关注,您的鼓励是博主进步的动力,感谢支持,共同进步。