集合a----列出它所有的不颠倒顺序的子集合

需求是:就是不能颠倒顺序 如出现  a集合

因为不能颠倒顺序,那么就按照原来的顺序  只是显示与不显示的问题  1--显示 0 --不显示

 private static void sort2(char[] b){
    	int len = b.length ;
    	int allValidNo = (1<<(len)) -1; // 111 is equals 2^4 -1 ....1<<3 is 2^4
    	int pos1 = 1;  //这个东西会由1--> 10--->100 即可探测  其他数这个位置上有没有一
    	for(int validNo=1 ; validNo<= allValidNo ; validNo++){
                char[] buff = new char[len];//每次循环产生一个合理结果
                pos1 = 1; //初始化游标,用来判断数组的这个位置上是否为1
    		for(int pos=0 ; pos<len ; pos++){ //遍历数组,拿到符合条件的值
    			if((pos1&validNo) == pos1){// 如 010 &111  可探测 第2位是否是1
    				buff[pos] = b[pos];
    			}
    			pos1= pos1<<1; 
 			
    		}
    		printBuffer(buff);
    		
    	}


上次别人问的一个问题:
1到19数字,加起来等于20。不限加数,但是每个数只能出现一次。用java打印全部可能性。 
其实就用这种方法就可以搞定

public static void main(String[] args) {
       int[] arr = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19};
       //先构造19个1
       long len = 1<<arr.length -1;
       for(long i=1;i<=len;i++){ //遍历所有可能
    	  long cursor = 1;
    	  int count = 0;
    	  StringBuilder temp = new StringBuilder();
    	   for(int pos=0;pos<arr.length;pos++){//遍历数组
    		   if((arr[pos]+count)>20)break;
    		  if((cursor&i)==cursor&&(arr[pos]+count)<20){
    			  count +=arr[pos];
    			  temp.append(Integer.toString(arr[pos])).append("+");
    		  }else if((cursor&i)==cursor&&(arr[pos]+count)==20){
    			  temp.append(Integer.toString(arr[pos]));
    			  System.out.println(temp.toString());
    		  }
    		  cursor =  cursor<<1;
    	   }
    	
       }
	}


void printf_a(int sum, int n, vector<int> vec)
{
  if(n < 20)
    printf_a(sum, n + 1, vec);
  if( sum + n < 20)
  {
    vec.push_back(n);
    printf_a(sum + n, n + 1, vec);
  }
  else if (sum + n == 20 && sum != 0)
  {
    for (int i = 0; i < vec.size(); i++)
    {
      printf(" %d ", vec[i]);
    }
    printf(" %d ", n);
    printf("\n");
    return;
  }
  else
    return;
}

你可能感兴趣的:(集合)