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