本文参考自《剑指offer》一书,代码采用Java语言。
题目
从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王可以看成任意数字。
思路
输入为大小等于5的数组(大小王记为0),输出为布尔值。具体步骤如下:
1)进行对5张牌进行排序;
2)找出0的个数;
3)算出相邻数字的空缺总数;
4)如果0的个数大于等于空缺总数,说明连续,反之不连续;
5)记得判断相邻数字是否相等,如果有出现相等,说明不是顺子。
测试算例
1.功能测试(没有/有一个/多个大小王,有对子,连续/不连续)
2.特殊测试(null)
Java代码
//题目:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。
//2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王可以看成任意数字。
public class ContinousCards {
public boolean isContinuous(int [] numbers) {
if(numbers==null || numbers.length<=0)
return false;
Arrays.sort(numbers);
int numberOf0 = 0;
int numberOfGap = 0;
for(int i=0;i
if(numbers[i]==0)
numberOf0++;
}
int small = numberOf0;
int big = numberOf0+1;
while(big
if(numbers[small]==numbers[big])
return false;
numberOfGap+=numbers[big++]-numbers[small++]-1;
}
if(numberOf0>=numberOfGap) //大于等于,而不是等于!
return true;
return false;
}
}
收获
1.这道题中,自己最开始想的是把0插入到空缺当中,当其实只要计算出0的个数和空缺的个数进行比较即可,有时候稍微转换一下思路就豁然开朗了。
2.对数组排序,采用Arrays.sort(numbers)方法(快排原理)。