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

[code]
需求是:就是不能颠倒顺序 如出现 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;
}

[/code]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值