本文参考自《剑指offer》一书,代码采用Java语言。html
更多:《剑指Offer》Java实现合集 java
从扑克牌中随机抽5张牌,判断是否是一个顺子,即这5张牌是否是连续的。2~10为数字自己,A为1,J为11,Q为12,K为13,而大、小王能够当作任意数字。数组
输入为大小等于5的数组(大小王记为0),输出为布尔值。具体步骤以下:post
1)进行对5张牌进行排序;测试
2)找出0的个数;url
3)算出相邻数字的空缺总数;htm
4)若是0的个数大于等于空缺总数,说明连续,反之不连续;blog
5)记得判断相邻数字是否相等,若是有出现相等,说明不是顺子。排序
测试算例 get
1.功能测试(没有/有一个/多个大小王,有对子,连续/不连续)
2.特殊测试(null)
//题目:从扑克牌中随机抽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<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; } }
1.这道题中,本身最开始想的是把0插入到空缺当中,当其实只要计算出0的个数和空缺的个数进行比较便可,有时候稍微转换一下思路就豁然开朗了。
2.对数组排序,采用Arrays.sort(numbers)方法(快排原理)。