从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2-10为数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意数字。
方法一:1.排序,2.求出0个数 3.求出非0的牌之间的差距 如果差距小于等于0的个数那么即为顺子。时复o(nlogn+n)
方法二:求出0个数,非0牌的最大值和最小值,max-min+N0 <= 5 ? 如果满足那么是顺子。中间加上重复的判断。时复o(n)
方法一:
bool IsContinuous(std::vector<int> numbers, int maxNumber)
{
if(numbers.size() == 0 || maxNumber <=0)
return false;
// Sort the array numbers.
std::sort(numbers.begin(), numbers.end());
int numberOfZero = 0;
int numberOfGap = 0;
// how many 0s in the array?
std::vector<int>::iterator smallerNumber = numbers.begin();
while(smallerNumber != numbers.end() && *smallerNumber == 0)
{
numberOfZero++;
++smallerNumber;
}
// get the total gaps between all adjacent two numbers
std::vector<int>::iterator biggerNumber = smallerNumber + 1;
while(biggerNumber < numbers.end())
{
// if any non-zero number appears more than once in the array,
// the array can't be continuous
if(*biggerNumber == *smallerNumber)
return false;
numberOfGap += *biggerNumber - *smallerNumber - 1;
smallerNumber = biggerNumber;
++biggerNumber;
}
return (numberOfGap > numberOfZero) ? false : true;
}
转载自:http://zhedahht.blog.163.com/blog/static/25411174200951262930831/