我正在尝试找出上述问题的解决方案,我想出了这个
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
public class Subset_K {
public static void main(String[]args)
{
Set<String> x;
int n=4;
int k=2;
int arr[]={1,2,3,4};
StringBuilder sb=new StringBuilder();
for(int i=1;i<=(n-k);i++)
sb.append("0");
for(int i=1;i<=k;i++)
sb.append("1");
String bin=sb.toString();
x=generatePerm(bin);
Set<ArrayList <Integer>> outer=new HashSet<ArrayList <Integer>>();
for(String s:x){
int dec=Integer.parseInt(s,2);
ArrayList<Integer> inner=new ArrayList<Integer>();
for(int j=0;j<n;j++){
if((dec&(1<<j))>0)
inner.add(arr[j]);
}
outer.add(inner);
}
for(ArrayList<Integer> z:outer){
System.out.println(z);
}
}
public static Set<String> generatePerm(String input)
{
Set<String> set = new HashSet<String>();
if (input == "")
return set;
Character a = input.charAt(0);
if (input.length() > 1)
{
input = input.substring(1);
Set<String> permSet = generatePerm(input);
for (String x : permSet)
{
for (int i = 0; i <= x.length(); i++)
{
set.add(x.substring(0, i) + a + x.substring(i));
}
}
}
else
{
set.add(a + "");
}
return set;
}
}
我正在研究一个用于测试目的的4个元素集,并使用k = 2。我尝试做的是最初生成一个二进制字符串,其中设置k位并且不设置n-k位。现在使用这个字符串,我找到了这个字符串的所有可能的排列。然后使用这些排列,我输出集合中的相应元素。现在我无法弄清楚这段代码的复杂性,因为我使用了其他人的generatePerm方法。有人可以帮助我解决generatePerm方法的时间复杂性以及我的解决方案的总体时间复杂性。我在这里找到了这个问题的其他递归实现Find all subsets of length k in an array但是我也无法弄清楚它的复杂性。所以需要一些帮助。
此外,我试图重新考虑我的代码,使其不仅适用于整数,还适用于所有类型的数据。我对泛型没什么经验。所以当我尝试修改ArrayList&lt;整数&GT;到ArrayList&lt; ?&GT;第21行eclipse说
无法实例化类型ArrayList&lt; ?&GT; 我该如何纠正?
答案 0 :(得分:3)
您可以始终使用ArrayList<Object>
。这将接受任何类型的对象。如果您想要一个由调用代码确定的特定类型,则需要引入泛型类型参数。
请注意,在generatePerm
方法中,您不应使用测试
if (input == "")
相反,你应该使用:
if ("".equals(input))
如果input
是 interned 字符串""
,则您当前的代码才会成功。例如,如果将input
计算为长度为零的substring()
,则无法工作。通常,您应始终将字符串与.equals()
而不是==
进行比较(在非常特定的条件下,当您查找对象标识而不是对象相等时)。