说我有整整5张卡片排序的数组所有可能的连续的子集,它显然是不排序,我怎么能找到长度所有可能的直线(S)的? (直具有3至少长度)查找使用JAVA
埃斯将仅被认为是1。
例如,如果我有一组卡:A(铲)3(心脏)K(心脏)3(铲)2(心脏)
期望的输出将是:3,3
又如,如果我有一组卡:A(铲)3(心脏)A(俱乐部)3(铲)2(心脏)
期望的输出将是:3,3,3,3
说我有整整5张卡片排序的数组所有可能的连续的子集,它显然是不排序,我怎么能找到长度所有可能的直线(S)的? (直具有3至少长度)查找使用JAVA
埃斯将仅被认为是1。
例如,如果我有一组卡:A(铲)3(心脏)K(心脏)3(铲)2(心脏)
期望的输出将是:3,3
又如,如果我有一组卡:A(铲)3(心脏)A(俱乐部)3(铲)2(心脏)
期望的输出将是:3,3,3,3
如果您只对所有可能的直线长度感兴趣,您可以使用组合知识。
你有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
s,将需要一个循环,将循环接受的每个长度的直线和每个启动卡。
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();
}
谢谢你,我没有检查过这个问题,因为我在我的帖子后发现了。但无论如何,谢谢! –
你尝试过这么远吗?你面临什么具体问题?这似乎是一个家庭作业问题。 [问] – tddmonkey
你是如何到达这些输出的?你有什么尝试? – 4castle
@ Scott.D是我做过的你想要的东西? – xenteros