【Java】 剑指offer(61) 扑克牌的顺子
本文参考自《剑指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<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)方法(快排原理)。