面试题44:扑克牌的顺子
题目:从扑克牌中随机抽取5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大王小王可以看成任意数字。
分析:我们用0来表示大王和小王。判断5个数字是否是连续的有如下三步:
1. 将数组排序
2. 统计数组中0的个数
3. 统计排序之后的数组中相邻数字之间的空缺总数。如果空缺的总数小于或者等于0的个数,那么这个数组就是连续的;反之不连续。
还需要注意的是,如果数组中的非0数字重复出现,则该数组不是连续的。
1 bool isContinuous(vector<int>&numbers) 2 { 3 int n = numbers.size(); 4 if ( n != 5 ) 5 return false; 6 quickSort(numbers); 7 //统计0的个数 8 int numberOfZero = 0; 9 for (int i = 0; i < n; ++i) 10 { 11 if (numbers[i]==0) 12 numberOfZero++; 13 } 14 //统计空缺总数 15 int numberOfGap = 0; 16 for (int i = 0; i < n-1; ++i) 17 { 18 if (numbers[i]==numbers[i+1]) 19 return false; 20 numberOfGap += numbers[i+1]-numbers[i]-1; 21 } 22 return (numberOfGap <= numberOfZero)?true:false; 23 }
PS:由于本题的数组只有5个数,因此排序算法的选择不会有多少区别。