从长度为n的数组(元素互不相同)中任意选择m个数的所有组合

 

//分析及构思

1.键盘输入数组的长度

2.键盘输入组合的个数

3.利用随机数获得一个数组

4.在构建数组是要对数组中的元素进行判断,保证新生成的随机数与之前的数不同

5.以数组a[]和m为参数调用方法zuhe(a,m)得到一个list  

6.遍历输出list

算法:
1.创建一个辅助数组tempNum和a相对应.tempNum中的值是0或1,1所在的位置就是我们要在a中取值的位置.
2.对数组tempNum进行赋初始值,从0位置开始,到m-1位置赋值为1,其它赋值为0
3.调用print函数,输出当前tempNum数组的状态(作为参考)
4.调用createResult方法,方法返回一个int型的数组,作为list.add()的参数给list容器赋第一个值 list.add(zuhe.createResult(a, tempNum, m));
5.循环开始:从左往右遍历tempNum,找到第一个10,将其变成01,并且记录位置pose,算出该位置左边有多少个1,将这些1全部移到最左边,判断n-m位置到n-1位置是否
全部为1,设置flag,默认值为false,如果n-m到n-1位置有0,则将flag置TRUE,继续进行do-while 循环,否则循环结束,得到一个list容器,里面装的值就是我们需要的各种
组合情况.
6调用print1函数,将list打印出来.

11100
11010   pose=2  sum=2     flag=false
10110   pose=1  sum=1     flag=false
01110   pose=0  sum=0     flag=false
01101   pose=3  sum=2     flag=false
->11001
10101   pose=1  sum=1     flag=false
01101   pose=0  sum=0     flag=false
01011   pose=2  sum=1     flag=false
->10011
01011   pose=0  sum=0     flag=false
00111   pose=1  sum=0     flag=true 
return list;

 

 

 

//编码
 
package xxx;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Scanner;public class Zuhe1 {

		        	private List zuhe(int[] a, int m) { 
		        		Zuhe1 zuhe = new Zuhe1(); 
		        		List list = new ArrayList(); 
		        		int n = a.length;
		        		boolean flag = false; // 是否是最后一种组合的标记

		        		// 生成辅助数组。首先初始化,将数组前n个元素置1,表示第一个组合为前n个数。 
		        		int[] tempNum = new int[n]; 

		        		for (int i = 0; i < n; i++) { 
		        		if (i < m) { 
		        		tempNum[i] = 1;
		        		} else { 
		        		tempNum[i] = 0; 
		        		} 

		        		} 
		        		print(tempNum);// 打印辅助数组
		        		list.add(zuhe.createResult(a, tempNum, m));// 打印第一中默认组合
		        		do { 
		        		int pose = 0; // 记录改变的位置 
		        		int sum = 0; // 记录改变位置 左侧 1 的个数 

		        		// 然后从左到右扫描数组元素值的“10”组合,找到第一个“10”组合后将其变为“01” 
		        		for (int i = 0; i < (n - 1); i++) { 
		        		if (tempNum[i] == 1 && tempNum[i + 1] == 0) { 
		        		tempNum[i] = 0; 
		        		tempNum[i + 1] = 1; 
		        		pose = i; 
		        		break; 
		        		} 
		        		} 


		        		print(tempNum);// 打印辅助数组 
		        		list.add(zuhe.createResult(a, tempNum, m));// 打印第一中默认组合
		        		// 同时将其左边的所有“1”全部移动到数组的最左端。
		        		for (int i = 0; i < pose; i++) { 
		        		if (tempNum[i] == 1) 
		        		sum++; 
		        		}
		        		for (int i = 0; i < pose; i++) { 
		        		if (i < sum) 
		        		tempNum[i] = 1; 
		        		else 
		        		tempNum[i] = 0; 
		        		}
		        		// 判断是否为最后一个组合:当第一个“1”移动到数组的m-n的位置,即n个“1”全部移动到最右端时,就得到了最后一个组合。 
		        		flag = false; 
		        		for (int i = n - m; i < n; i++) {
		        		if (tempNum[i] == 0) 
		        		flag = true;
		        		} 
		        		} while (flag);
		        		return list; 
		        		}


		        		// 根据辅助数组和原始数组生成 结果数组 
		        		public int[] createResult(int[] a, int[] temp, int m) { 
		        		int[] result = new int[m];
		        		int j = 0; 
		        		for (int i = 0; i < a.length; i++) {
		        		if (temp[i] == 1) { 
		        		result[j] = a[i]; 
		        		System.out.println("result[" + j + "]:" + result[j]); 
		        		j++;
		        		} 
		        		}
		        		return result; 
		        		}

		        		// 打印 
		        		public void print1(List list) {
		        		for (int i = 0; i < list.size(); i++) { 
		        		System.out.println(); 
		        		int[] temp = (int[]) list.get(i); 
		        		for (int j = 0; j < temp.length; j++) { 
		        		System.out.print(temp[j] + " "); 
		        		} 
		        		} 
		        		}

		        		// 打印整数数组的方法 
		        		public void print(int[] a) { 
		        		System.out.println("生成的辅助数组为:"); 
		        		for (int i = 0; i < a.length; i++) { 
		        		System.out.print(a[i]); 
		        		} 
		        		System.out.println(); 
		        		}


		        		public static void main(String[] args) { 

		        			Random random = new Random();
		        			Scanner scan =new Scanner(System.in);
		        			System.out.println("请输入数组元素的个数:");
		        			int m=scan.nextInt();
		        			int[] a= new int[m];
		        			int b=0;

		        			int i=0;
		        			for(;i<m;i++){

		        				b=random.nextInt(101);
		        								a[i]=b;

		        				for(int j=0;j<i;j++){
		        					if(a[j]==b){	       						
		        						--i;
		        						break;
		        					}
		        				}

		        			}



		        			System.out.print("这是随机生成的数组:");
	                     for(int k=0;k<a.length;k++){
		        				System.out.print(a[k]+"   ");


		        			}

		        			System.out.println();


		        			System.out.println("请输入组合元素的个数:");
		        			int n=scan.nextInt();




		        		Zuhe1 zuhe = new Zuhe1(); 
		        		List list = zuhe.zuhe(a, n); 
		        		zuhe.print1(list);
		        		} 





	}