// 程序员面试题精选100题(40)-扑克牌的顺子.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
using namespace std;
bool isSuccessive()
{
int arr[5];
int arrHash[16]={0};//大小王是14,15,有值为1
for (int i=0;i<5;i++)
{
cin>>arr[i];
arrHash[arr[i]]=1;
}
int s=1;
for (int i=1;i<=15;i++)
{
if(arrHash[i]==1)
{
s=i;// from the start point on, the array should be successive
break;
}
}
if (s>=12) return false;
for (int i=1;i<5;i++)
{
if (arrHash[s+i]==0)// resort to the 14 or 15, junior king or senior king
{
if (arrHash[14]==1)//first utilize 14 then 15
{
arrHash[14]=0;
}
else
{
if(arrHash[15]==1)
{
arrHash[15]=0;
}
else return false;
}
}
}
return true;
}
// Determine whether numbers in an array are continuous
// Parameters: numbers: an array, each number in the array is between
// 0 and maxNumber. 0 can be treeted as any number between
// 1 and maxNumber
// maxNumber: the maximum number in the array numbers
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;
}
int _tmain(int argc, _TCHAR* argv[])
{
while (1)
{
cout<<isSuccessive()<<endl;
}
system("pause");
return 0;
}
这道题考什么呢?
程序员面试题精选100题(40)-扑克牌的顺子
最新推荐文章于 2024-04-28 03:39:30 发布