2016-10-04 38 views
-3

说我有整整5张卡片排序的数组所有可能的连续的子集,它显然是不排序,我怎么能找到长度所有可能的直线(S)的? (直具有3至少长度)查找使用JAVA

埃斯将仅被认为是1。

例如,如果我有一组卡:A(铲)3(心脏)K(心脏)3(铲)2(心脏)

期望的输出将是:3,3

又如,如果我有一组卡:A(铲)3(心脏)A(俱乐部)3(铲)2(心脏)

期望的输出将是:3,3,3,3

+2

你尝试过这么远吗?你面临什么具体问题?这似乎是一个家庭作业问题。 [问] – tddmonkey

+0

你是如何到达这些输出的?你有什么尝试? – 4castle

+0

@ Scott.D是我做过的你想要的东西? – xenteros

回答

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++; 
} 

算法的思路是:

  1. 做一个过滤器,其中,每个单元都会说你多少级i的卡都有。
  2. 搜索可以变直的卡片的最长序列。你只能有一个适当的长度。
  3. 取决于序列的长度和每张卡片的出现次数每个直线的长度。

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(); 
} 
+1

谢谢你,我没有检查过这个问题,因为我在我的帖子后发现了。但无论如何,谢谢! –