TCHS 90-2 (全集的所有子集问题)

此题为给一个集合,求所有子集中的某一个子集,这个子集满足条件:
1,此集合的和为一个level2幸运数字,该数字要么全是7,要么全是4
2,该集合为满足条件中所有数组中和最大的一个
3,如果有多个这样的数组,返回字典序最小的那个。
 
其中比较重要的算法就是求一个集合的所有子集:
如下:
 
int [] numbers ={};
  ArrayList al = new ArrayList();
  Arrays.sort(numbers);
  int t=1<<numbers.length;
  int i;
  for(i=0;i<t;i++)
  {
   ArrayList a = new ArrayList();
   int j=i;
   int k=0;
   while(j>0)
   {
    if((j&1)>0) //与运算判断j第k位是否为1,来决定第k个元素在不在地i个子集中
    {
     a.add(numbers[k]);
    }
    k++;
    j=j>>1;   //右移一位来继续判断
   }
   al.add(a);
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
该题解为:
还有一些漏洞:最后一个用例过不了,字典序还有一些问题。
 
 
import java.util.*;
public class TheLuckyNumbersLevelTwo
{
 public static boolean confirm(long numbers)
 {
  String s =String.valueOf(numbers);
  if (s.charAt(0)=='4')
  {
   for(int x=0;x<s.length();x++)
   {
    if(s.charAt(x)=='4')
     ;
    else
     return false;
       if(x==s.length()-1)
        return true;
   }
   
  }
  if(s.charAt(0)=='7')
  {
   for(int x=0;x<s.length();x++)
   {
    if(s.charAt(x)=='7')
     ;
    else
     return false;
       if(x==s.length()-1)
        return true;
   }
  }
 
  return false;
 
 }
 public static void sop(Object obj)
 {
  System.out.println(obj);
 }
 
 public static int [] find(int [] numbers)
 {
  ArrayList al = new ArrayList();
  Arrays.sort(numbers);
  int t=1<<numbers.length;
  int i;
  for(i=0;i<t;i++)
  {
   //System.out.println(i);
   ArrayList a = new ArrayList();
   
   int j=i;
   int k=0;
   while(j>0)
   {
    if((j&1)>0)
    {
     a.add(numbers[k]);
     
    }
    k++;
    j=j>>1;
   }
   
   al.add(a);
  }
  int sum[]= new int [al.size()];
 
  for(i=0;i<al.size();i++)
  {
   sum[i]=0;
   ArrayList p= (ArrayList)al.get(i);
   for(int j=0;j<p.size();j++)
   {
    sum[i]+=(int)p.get(j);
   
   }
  }
 
 
  for(i=0;i<sum.length;i++)
  {
   int min = sum[i];
    ArrayList minlist=(ArrayList) al.get(i);
   
  for(int j=i+1;j<sum.length;j++)
  {
   if(min>sum[j])
   {
    int k=min;
    min=sum[j];
    sum[j]=k;
   
    ArrayList w=minlist;
    minlist=(ArrayList)al.get(j);
    al.set(j, w);
   }
  }
  sum[i]=min;
  al.set(i, minlist);
 
  }
  for(i=sum.length-1;i>=0;i--)
  {
   if(confirm(sum[i]))
   {
    ArrayList p=(ArrayList)al.get(i);
    ArrayList p1=(ArrayList)al.get(i-1);
    if(i>=1)
    if(sum[i]==sum[i-1])
    {
     
     if((int)p.get(0)>(int)p1.get(0))
     {
      p=p1;
     }
    }
   
   
       int array[]=new int[p.size()];
       for(int x=0;x<p.size();x++)
        array[x]=(int) p.get(x);
       return array;
   }
   
  }
 
  int a[]={};
  return a;
 }
 public static void main(String[] args)
 {
  int x [] ={1, 2, 3, 4};
  int a[];
  a=find(x);
  for(int y=0;y<a.length;y++)
   System.out.println(a[y]);
 }
}

 

posted @ 2015-07-25 15:35  hitz&x  阅读(121)  评论(0编辑  收藏  举报