日期:2014-05-20  浏览次数:20730 次

java算法问题
有数组int[] masks = {1,2,4,8,16,32,64,128},现在我有一个常量m,
m是由masks里面的若干数字相加得来的,比如m=7,得到m=1+2+4,
129 = 128+1等等
写一个方法如何得到m由哪几个数字组成。

------解决方案--------------------
给你弄了做了一个,可以精简修改一下,希望对你有帮助。



public class TesNumber {
public static int[] ss = {1,2,4,8,10,16,20,32,64,128};
public static int point=-1;
public static void main(String args[]){
for(int i=0;i<ss.length-1;i++){
if(24>=ss[i]){
point=i;
}
}
for(int j=2;j<point+1;j++){
List<String> list=getValue(24,j);
for(String strData:list){
System.out.println(strData);
}
}
}

public static List<String> getValue(int data,int index){
//得到小于给出数的数组最大索引,减少数组的大小
List<String> list=new ArrayList();
Map<String,Integer> map=progressData(index);
for(String str:map.keySet()){
if(map.get(str)==data){
list.add(str);
}
}
return list;
}

//得到精简的小于给出的数的数组
public static int[] getNewObject(){
int[] ss2 = new int[point+1];
for(int i=0;i<=point;i++){
ss2[i]=ss[i];
}
Arrays.sort(ss2);
return ss2;
}

//递归得到无重复的排列组合
public static Map progressData(int num){
Map<String,Integer> map=new LinkedHashMap<String,Integer>();
int[] ss2 = getNewObject();
if(num==2){
for(int k=0;k<=point-1;k++){
for(int n=k+1;n<=point;n++){
map.put(""+ss2[k]+"+"+ss2[n], ss2[k]+ss2[n]);
}
}

}
else{
Map<String,Integer> map2=progressData(num-1);
for(String strt:map2.keySet()){
for(int x=0;x<ss2.length;x++){
if(!strt.contains(String.valueOf(ss2[x]))){
String clearString=strt.trim();
String[] stringClear=clearString.split("\\+");
//从小到大,无重复
boolean flag=false;
for(String sss:stringClear){
if(ss2[x]<Integer.parseInt(sss)){
flag=true;
}
}
if(!flag){
int value=map2.get(strt);
map.put(""+strt+"+"+ss2[x], value+ss2[x]);
}
}
}
}
}
return map;
}