题目:
从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大王、小王可以看成任意数字。
分析:
将大小王看成0,将数组排序,统计数组中空缺的数字个数,如果个数小于大小王的个数,就可以构成顺子,如果数组中有重复的非0数字,就不能构成顺子。可以借助哈希表
对上面稍作了一点改变的我的思路:
class Solution
{
public:
bool IsContinuous( vector<int> numbers )
{
int hashArray[14] = { 0 };
int absent = 0;
//将numbers中的数字保存到hashArray中后,最小的数的下标是start,最大的数的下标是end
int start = -1, end = -1;
if ( numbers.empty() )
return false;
for ( int i = 0; i < numbers.size(); ++i )
{
hashArray[numbers[i]]++;
}
for ( int i = 1; i < 14; ++i )
{
if ( hashArray[i] != 0 )
{
if ( start == -1 )
{
start = i;
end = i;
}
else
end = i;
if ( hashArray[i] > 1 )
return false;
}
}
//(end-start+1) 是数组中最大元素和最小元素之间一共元素个数(包括边界)
//如果数组中[start, end]之间的元素个数小于或等于numbers中元素的个数,说明numbers零可以补充空缺位
if ( (int)(( end-start+1 ) - numbers.size()) <= 0 )
{
return true;
}
else
{
return false;
}
}
};
int main( void )
{
Solution sos;
vector<int> test = { 3, 0, 0, 0, 0 };
cout << sos.IsContinuous( test );
return 0;
}