我需要创建一个根据卡片对进行排序的排序算法,例如,如果您有一个4JJQQ,那么它应该对QQJJ4进行排序。我尝试了许多不同的方法,但似乎很难把顺序弄对。我基本上有一系列的卡片,包括那只手。
发布于 2012-05-30 07:50:37
如果你的主要问题是比较像J这样的文字和像4这样的数字,那么就是你的解决方案。
它是什么:它是一种排序算法,适用于排序的可能值有限的情况。您创建了一个包含所有可能值的表,在扫描中,对表中相应行中更新相同值的每个文字的所有出现次数进行计数。然后,您所要做的就是使用它对原始数组进行排序,以适合您的偏好顺序。
优点:计数排序是一种比合并和快速排序等其他通用算法更快的算法(平均需要O(n)时间)。如果您确实有有限的可能值,那么我建议您使用它。
现在到了对它进行“成对”排序的部分,这是我不太理解的。您能说出以下测试用例"JJQJ4“和"JQ329”的预期答案是什么吗?
如果您的答案模式是按递减顺序排列的卡片对,则只需修改计数排序,使其首先填充偶数张牌。如果任何文字的剩余可用卡片为1或0,它将在最后填充它们。
JJQJ4和QJ923。
替代方案:
您提到,当两个字面值很明显是一对时,您希望跳过必须对它们进行比较。
文字的插入将被修改。
当你得到45JJQ的时候,
1)输入:4.进程:存储4作为播放器节点的rChld
2)输入:5。进程:将5存储为4的rChld
3)输入:j。进程:将J存储为rChld of 5
4)输入:j。J被存储为玩家节点的子节点(同样,以二叉树的方式,即,如果在lChld两对中已经存在一个字面量,则J将被存储为基于它是大还是小的字面量的左或右子节点)。
5)输入:q。进程:将Q存储为rChld of 5
要比较两张牌,首先成对地搜索最高的牌(最右边的子牌没有子牌)。您还可以轻松地计算配对的数量。在一般的二叉树中,您可能需要BFS或DFS。但由于您最多只能有2对,所以您可以很容易地做到这一点。如果lChld为空,则在rChild中重新搜索具有单卡的高卡。
注意:如果你真的在做一个类似于扑克的游戏,你可能也想要类似于3的东西。这可以通过在玩家节点的左子节点中存储“权重”来容纳在节点中。也就是说,如果J出现两次,权重为2,如果出现三次,权重为3,依此类推。
发布于 2012-05-30 07:40:03
如果类型= {A,K,Q,J,A,10..2} (可能是Java的enum ),其中A>K>Q>J> 10 > ... >2
然后,这样就可以了:
class Card implements Comparable<Card> {
public TYPE ty;
public Card(TYPE t) {
ty = t;
}
public int compareTo(Card card) {
return card.ty - ty; //you should rewrite this according to [1] rules
}
}排序:
Collections.sort(listOfCards); where listOfCards is a List<Card>.1
https://stackoverflow.com/questions/10808024
复制相似问题