C:检查数组中等效性的更有效方法?

时间:2017-03-09 05:34:16

标签: c

我的功能正常运行,但我希望看看是否有更有效的方法来检查我手中是否有三种类型,所以我不需要这么多嵌套循环。我不确定是否有。我正在使用卡片中的卡片的枚举和结构。

3 个答案:

答案 0 :(得分:2)

有多种方法可以做到这一点。最好的方法取决于您在数组中的条目类型?

总卡数有限吗?我的意思是,这是数组中的最大值? (因为它们是卡片,我猜它们可以从1-13开始)。 然后最好的选择是创建另一个大小为13的数组counter并用0初始化它们。迭代所有元素然后递增你看到的卡的counter。在任何时候,如果计数器== 3返回true,则结尾为false。

实施将是

int counter[13] = {0};
for ( i = 0; i < 5; i++ ){
    card = hands[i].cardRank;
    counter[card]++;
    if (counter[card] == 3)
        return true;
return false;

如果卡的值不受限制,您可以以类似的方式使用散列图。

如果您无法使用hashmap数据结构,则必须使用其他方法。

在这里,您将首先对数组进行排序。因此,如果有3次出现,他们会聚在一起。在一个循环中,您可以检查它们。对于每个元素,检查下一个元素和下一个元素的下一个元素是否相同。如果是,则返回true。

否则最终会返回false。 我认为这个代码很容易实现。

如果你无法弄明白,我可以发帖。

答案 1 :(得分:1)

您可以为每个卡片等级创建一个包含一个元素的整数数组。这将计算该等级中有多少张牌。通过手迭代,并为每张卡增加相应等级的等级计数数组。然后遍历rank-count数组并查看是否有任何值等于3.此方法也适用于查找四种类型。如果按降序迭代排名计数数组,则可以找到排名最高的组。

答案 2 :(得分:0)

如果你的手被分类,你可以这样做:

for(int i = 0 ; i < 5 - 2; ++i){
  if (hand[i].cardRank == hand[i+1].cardRank && hand[i].cardRank == hand[i+2].cardRank){
    // triplets found
}