假设我有5张牌,显然未分类,我怎么能找到 所有可能直线的长度 ? (直的长度至少为3)
Ace只会被视为1。
例如,如果我有一套牌:A(铲子)3(心脏)K(心脏)3(铲子)2(心脏)
期望的输出将是:3,3
另一个例子,如果我有一套牌:A(铲子)3(心脏)A(球杆)3(铲子)2(心脏)
期望的输出将是:3,3,3,3
答案 0 :(得分:1)
如果您只对所有可能直道的长度感兴趣,可以使用组合学知识。
你有5张牌。让我们用数字代表他们。您将自己更改为Card
:
int[] filter = new int[13];
for (int i = 0; i < 5; i++) {
filter[cards[i]]++;
}
int j = 0;
while (j < 13) {
if (filter[j] > 0) {
int length = 0;
while (filter[j] > 0) {
length++;
j++;
}
if (length == 3) {
for (int k = 0; k < filter[j - 1] * filter[j - 2] * filter[j - 3]; k++) {
System.out.print(3 + " ");
}
}
if (length == 4) {
for (int k = 0; k < filter[j-1] * filter[j - 2] * filter[j - 3] * filter[j - 4]; k++) {
System.out.print(4 + " ");
}
for (int k = 0; k < filter[j-1] * filter[j - 2] * filter[j - 3]; k++) {
System.out.print(3 + " ");
}
for (int k = 0; k < filter[j - 2] * filter[j - 3] * filter[j - 4]; k++) {
System.out.print(3 + " ");
}
}
if (length == 5) {
System.out.println("5 4 4 3 3 3");
}
}
j++;
}
算法的想法是:
i
的卡数。示例强>:
cards = {1, 2, 2, 3, 4];
filter = {0, 1, 2, 1, 1, 0, 0...}
长度是4,所以让我们看看我们可以直接长度为4次。答案是1*2*1*1
。我们可以连续多长时间3次? 1*2*1 + 2*1*1
。
如果要扩展一般用途,唯一需要改变的是打印。不需要三个if
,而是需要一个循环,它可以循环接受的每个直线长度和每张起始卡。
for (int l = length; l > minLength; l--) {
int amount = 1;
for (int m = 0; m < length - l + 1; m++) { //there might be by 1 mistake
amount *= filter[j - m - 1];
}
for (int m = 0; m < amount; m++) {
System.out.print(l + " ");
}
System.out.println();
}