zoukankan      html  css  js  c++  java
  • JAVA的算法实现--从长度为n的数组(元素互不相同)中任意选择m个数的所有组合

    从长度为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);
    }





    }

  • 相关阅读:
    angualr清除定时器
    flex布局常用属性
    将数组分割为几个等长度的子数组(使用slice)
    vue+element搭建的后台管理系统
    世界这么大,我想去看看!!!
    angularJs自定义指令(directive)实现滑块滑动
    适用初学者:vue2.0构建单页应用最佳实战
    笔记本win10安装node的尖酸历程。。。。。。
    js对数组处理(数组里边相同元素提取成map)
    快速搞定用Vue+Webpack搭建前端项目(学习好久了,该写点东西了......)
  • 原文地址:https://www.cnblogs.com/gengshidong/p/6525172.html
Copyright © 2011-2022 走看看