程序员面试题精选--扑克牌的顺子
2011-10-04 17:00
465 查看
转自http://zhedahht.blog.163.com/
题目:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2-10为数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意数字。
分析:这题目很有意思,是一个典型的寓教于乐的题目。
我们需要把扑克牌的背景抽象成计算机语言。不难想象,我们可以把5张牌看成由5个数字组成的数组。大小王是特殊的数字,我们不妨把它们都当成0,这样和其他扑克牌代表的数字就不重复了。
接下来我们来分析怎样判断5个数字是不是连续的。最直观的是,我们把数组排序。但值得注意的是,由于0可以当成任意数字,我们可以用0去补满数组中的空缺。也就是排序之后的数组不是连续的,即相邻的两个数字相隔若干个数字,但如果我们有足够的0可以补满这两个数字的空缺,这个数组实际上还是连续的。举个例子,数组排序之后为{0,1,3,4,5}。在1和3之间空缺了一个2,刚好我们有一个0,也就是我们可以它当成2去填补这个空缺。
于是我们需要做三件事情:把数组排序,统计数组中0的个数,统计排序之后的数组相邻数字之间的空缺总数。如果空缺的总数小于或者等于0的个数,那么这个数组就是连续的;反之则不连续。最后,我们还需要注意的是,如果数组中的非0数字重复出现,则该数组不是连续的。换成扑克牌的描述方式,就是如果一副牌里含有对子,则不可能是顺子。
参考代码如下:
题目:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2-10为数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意数字。
分析:这题目很有意思,是一个典型的寓教于乐的题目。
我们需要把扑克牌的背景抽象成计算机语言。不难想象,我们可以把5张牌看成由5个数字组成的数组。大小王是特殊的数字,我们不妨把它们都当成0,这样和其他扑克牌代表的数字就不重复了。
接下来我们来分析怎样判断5个数字是不是连续的。最直观的是,我们把数组排序。但值得注意的是,由于0可以当成任意数字,我们可以用0去补满数组中的空缺。也就是排序之后的数组不是连续的,即相邻的两个数字相隔若干个数字,但如果我们有足够的0可以补满这两个数字的空缺,这个数组实际上还是连续的。举个例子,数组排序之后为{0,1,3,4,5}。在1和3之间空缺了一个2,刚好我们有一个0,也就是我们可以它当成2去填补这个空缺。
于是我们需要做三件事情:把数组排序,统计数组中0的个数,统计排序之后的数组相邻数字之间的空缺总数。如果空缺的总数小于或者等于0的个数,那么这个数组就是连续的;反之则不连续。最后,我们还需要注意的是,如果数组中的非0数字重复出现,则该数组不是连续的。换成扑克牌的描述方式,就是如果一副牌里含有对子,则不可能是顺子。
参考代码如下:
#include<iostream> #include<vector> using namespace std; //Determine whether numbers in an array are continuous bool IsContinuous(vector<int> numbers, int maxNumber) { if(numbers.size()==0 || maxNumber<=0) return false; //sort the array numbers sort(numbers.begin(), numbers.end()); int numberOfJoker = 0; //number of Joker,represented by 0. int numberOfGap = 0; //number of Gap //get the number of Joker(also 0). vector<int>::iterator smallerNumber = numbers.begin(); while(smallerNumber != numbers.end() && *smallerNumber == 0) { numberOfJoker++; ++smallerNumber; } //get the total gaps between all adjacent two numbers vector<int>::iterator biggerNumber = smallerNumber + 1; while(biggerNumber != numbers.end()) { // if the adjacent two non-zero numbers are equal,they can't be continuous if(*biggerNumber == *smallerNumber) return false; numberOfGap += (*biggerNumber - *smallerNumber -1); smallerNumber = biggerNumber; ++biggerNumber; } // if there are too many gaps to fill with jokers, they are not continuous return (numberOfGap > numberOfJoker)? false : true; } int main() { int array[5] = {5,4,0,0,7}; vector<int> numbers(array, array+5); size_t maxNumber = 13; if(IsContinuous(numbers, maxNumber)) cout<<"true, they are continuous!"<<endl; else cout<<"false, they are not continuous!"<<endl; system("pause"); return 0; }
相关文章推荐
- 程序员面试题精选100题(40)-扑克牌的顺子
- 程序员面试题精选100题(40)-扑克牌的顺子[算法]
- 程序员面试题精选100题(40)-扑克牌的顺子
- 程序员面试题精选100题(16)-O(logn)求Fibonacci数列
- 程序员面试题精选100题(18)-用两个栈实现队列以及用两个队列实现栈
- 程序员面试题精选100题(18)-用两个栈实现队列[数据结构]
- 程序员面试题精选100题(42)-旋转数组的最小元素
- 程序员面试题精选100题 详解
- 程序员面试题精选100题(27)-二元树的深度[数据结构]
- 程序员面试题精选100题(39)-颠倒栈[数据结构]
- 程序员面试题精选100题(02)-设计包含min函数的栈
- 程序员面试题精选100题(08)-求1+2+...+n
- 程序员面试题精选(35):一次遍历链表求中间节点位置
- 翻转句子中单词的顺序(程序员面试题精选100题)
- 面试题44:扑克牌的顺子
- 程序员面试题精选算法58题加答案
- 程序员面试题精选100题(55)-不用+、-、×、÷数字运算符做加法
- 程序员面试题精选100题(07)-翻转句子中单词的顺序
- 程序员面试题精选100题(07)-翻转句子中单词的顺序[算法]
- 程序员面试题精选100题(43)-n个骰子的点数[算法]