题目
从扑克牌中随机抽5张牌,判断是不是一个顺子。即这5张牌是不是连续的。2-10为数字本身。A为1,J为11,Q为12,K为13.二大小王可以看成任何数字。
思路
把大小王看成0.
第一步,将这5个数排序。
第二步,统计大小王(0)的个数。
第三步,统计空缺的个数。
第四步,通过比较大小王的个数与空缺的个数判断是否为顺子。
代码
public static boolean isContinuous(int[] datas){
quickSort(datas,0,datas.length - 1);
int zeroNums = 0;
int gapNums = 0;
int current = 0;
int next = 1;
while(current < datas.length - 1){
if(datas[current] == 0)zeroNums++;
else {
if(datas[current] == datas[next])return false;
gapNums += (datas[next] - datas[current] - 1);
}
current = next;
next++;
}
if(zeroNums >= gapNums)return true;
else return false;
}
public static void quickSort(int[] datas,int left,int right){
int index = partiton(datas,left,right);
if(index > left){
quickSort(datas,left,index);
}
if(index < right){
quickSort(datas,index + 1,right);
}
}
public static int partiton(int[] datas,int left,int right) {
while (left < right) {
if (datas[right] >= datas[left] && left < right) right--;
int temp = datas[left];
datas[left] = datas[right];
datas[right] = temp;
if (datas[right] >= datas[left] && left < right) left++;
temp = datas[left];
datas[left] = datas[right];
datas[right] = temp;
}
return left;
}
总结
本题的关键是要深刻的理解题目。把具体问题抽象成数学模型。