判断 5 张牌是不是顺子,这里有两种方法,哪种更优一些?
问题:用户输入5张牌,程序判断这5张牌是不是顺子。牌点数由小到大排列:2.3.4.5.6.7.8.9.10.J.Q.K.A。
比如56789是顺子。
A是最大的牌,不能和最小的2连起来组成顺子,比如a.2.3.4.5不是顺子。
这个问题我google了一下,发现大部分答案都是先排序再判断。
现在已知另一种方法:
建立一个数组rank[13],并根据5张牌的点数花色为其赋值,使rank[i]为j代表点数为i的牌有j张,例如rank[3] = 2代表点数为3的牌有2张。
示例代码:
int rank[13] = {0};
for (i = 0; i < 5; i ++){
rank[hand[i][0]] ++; //hand[5][2]存储的是5张牌的点数和花色
然后根据rank[13]来判断是否顺子。
示例代码:
int i;
int num_consec = 0;
bool straight = false;
for (i = 0; rank[i] == 0; i ++);
while (i < 13 && rank[i] > 0){
num_consec ++;
i ++;
}
if (num_consec == 5){
straight = true;
return;
}
请问这种方法相比排序后判断的方法哪一种方法更优一些呢?或者在牌的数量增加时,这种方法有什么明显的弊端吗?
PS:我目前使用这种方法是因为C语言里的qsort()函数里面的参数似乎涉及到指针,我还看不太懂。