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