M选N的组合算法

只要每个数字出现一次就可以 
  举例 :也就是说123与321和213属于重复 只算一组
  此算法已经排除了重复数据
  应用--彩票的注数算法

本程序的思路是开一个数组b,其长度和数据数组一致,其前N位为1,N就是要取的数的个数,然后按照b的数据为1的下标来取数据数组的数字
然后从左到右扫描数组b元素值的“10”组合,找到第一个“10”组合后将其变为
“01”组合,同时将其左边的所有“1”全部移动到数组的最左端,“0”移到所有“1”和变为了“01”的中间
当b数组最右边的N个元素全部为1时 组合完毕
例如求5中选3的组合:

1 2 3 4 5 <-数组数组 
1 1 1 0 0 -->1,2,3
1 1 0 1 0 -->1,2,4
1 0 1 1 0 -->1,3,4
0 1 1 1 0 -->2,3,4
1 1 0 0 1 -->1,2,5
1 0 1 0 1 -->1,3,5
0 1 1 0 1 -->2,3,5
1 0 0 1 1 -->1,4,5
0 1 0 1 1 -->2,4,5
0 0 1 1 1 -->3,4,5

package test;

import java.util.ArrayList;
import java.util.List;

public class MyCombine {
 public static void main(String[] args) {
  String[] a = { "1", "2", "3", "4", "5","6","7"};
  int num = 5;
  MyCombine tp = new MyCombine();
  for (String obj : tp.combine(a, num)) {
   break;
   //System.out.println(obj);
  }
 }
 
 /**
  * 实现的算法
  * @param a 数据数组
  * @param num M选N中 N的个数
  * @return
  */
 private List<String> combine(String[] a, int num) {
  List<String> list = new ArrayList<String>();
  StringBuffer sb = new StringBuffer();
  String[] b = new String[a.length];
  for (int i = 0; i < b.length; i++) {
   if (i < num) {
    b[i] = "1";
   } else
    b[i] = "0";
  }

int point = 0;
  int nextPoint = 0;
  int count = 0;
  int sum = 0;
  String temp = "1";
  while (true) {
   // 判断是否全部移位完毕
   for (int i = b.length - 1; i >= b.length - num; i--) {
    if (b[i].equals("1"))
     sum += 1;
   }
   // 根据移位生成数据
   for (int i = 0; i < b.length; i++) {
    if (b[i].equals("1")) {
     point = i;
     sb.append(a[point]);
     sb.append(" ");
     count++;
     if (count == num)
      break;
    }
   }
   // 往返回值列表添加数据
   list.add(sb.toString());

// 当数组的最后num位全部为1 退出
   if (sum == num) {
    break;
   }
   sum = 0;

// 修改从左往右第一个10变成01
   for (int i = 0; i < b.length - 1; i++) {
    if (b[i].equals("1") && b[i + 1].equals("0")) {
     point = i;
     nextPoint = i + 1;
     b[point] = "0";
     b[nextPoint] = "1";
     break;
    }
   }
   // 将 i-point个元素的1往前移动 0往后移动
   for (int i = 0; i < point - 1; i++)
    for (int j = i; j < point - 1; j++) {
     if (b[i].equals("0")) {
      temp = b[i];
      b[i] = b[j + 1];
      b[j + 1] = temp;
     }
    }
   // 清空 StringBuffer
   sb.setLength(0);
   count = 0;
  }
  // 
  System.out.println("数据长度 " + list.size());
  return list;

}

}

http://dearseven.blog.163.com/blog/static/1005379222010471135567/

JAVA-- M选N的组合算法的更多相关文章

  1. [整] JavaScript m选n组合算法

    01转换法: 思路是开一个数组,其下标表示1到m个数,数组元素的值为1表示其下标代表的数被选中,为0则没选中. 首先初始化,将数组前n个元素置1,表示第一个组合为前n个数. 然后从左到右扫描数组元素值 ...

  2. 获取所有组合算法、获取全排列算法(java)

    转载声明:原文转自:http://www.cnblogs.com/xiezie/p/5574516.html 受到ACM1015的影响,个人感觉,有必要对统计学上的 全组合和全排列 进行一个简单的总结 ...

  3. Java面试宝典(5)算法

    二.算法与编程 1.编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔. 答: pack ...

  4. 关于Java中的继承和组合的一个错误使用的例子

    [TOC] 关于Java中的继承和组合的一个错误使用的例子 相信绝大多数人都比较熟悉Java中的「继承」和「组合」这两个东西,本篇文章就主要就这两个话题谈论一下.如果我某些地方写的不对,或者比较幼稚, ...

  5. Adaboost\GBDT\GBRT\组合算法

    Adaboost\GBDT\GBRT\组合算法(龙心尘老师上课笔记) 一.Bagging (并行bootstrap)& Boosting(串行) 随机森林实际上是bagging的思路,而GBD ...

  6. 排列组合算法(PHP)

    用php实现的排列组合算法.使用递归算法,效率低,胜在简单易懂.可对付元素不多的情况. //从$input数组中取$m个数的组合算法 function comb($input, $m) { if($m ...

  7. <Java中的继承和组合之间的联系和区别>

    //Java中的继承和组合之间的联系和区别 //本例是继承 class Animal { private void beat() { System.out.println("心胀跳动...& ...

  8. C#语法灵活运用之排列组合算法

    今天群里有朋友求一个排列组合算法,题目是给定长度,输出所有指定字母的组合. 如指定字母a.b.c.d.e.f,长度为2,则结果应为:aa.ab.ac ... ef.ff. 有朋友给出算法,很有特色: ...

  9. Lua版组合算法

    高效率的排列组合算法--<编程珠矶>--Lua实现 原文链接 原文是python实现的,这里给出lua版本的实现 组合算法     本程序的思路是开一个数组,其下标表示1到m个数,数组元素 ...

随机推荐

  1. 用jQuery.ajaxWebService请求WebMethod,Ajax处理实现局部刷新

    首先在aspx.cs文件里建一个公开的静态方法,然后加上WebMethod属性. 如: [WebMethod]  public static string GetUserName()   {  //. ...

  2. [设计模式] Javascript 之 外观模式

    外观模式说明 说明:外观模式是用于由于子系统或程序组成较复杂而提供的一个高层界面接口,使用客户端更容易访问底层的程序或系统接口; 外观模式是我们经常使用遇到的模式,我们经常涉及到的功能,可能需要涉及到 ...

  3. 由DataGridTextColumn不能获取到父级DataContext引发的思考

    在项目中使用DataGrid需要根据业务动态隐藏某些列,思路都是给DataGrid中列的Visibility属性绑定值来实现(项目使用MVVM),如下 <DataGridTextColumn H ...

  4. 为HTML添加图片登录按钮

    来源于:http://www.2cto.com/kf/201510/447673.html <!DOCTYPE html> <html> <head lang=" ...

  5. NumberFormat类的用法

    NumberFormat.getInstance()方法返回NumberFormat的一个实例(实际上是NumberFormat具体的一个子类,例如DecimalFormat), 这适合根据本地设置格 ...

  6. reboot-css

    dd, label { margin-bottom: .5rem; }abbr[title] { text-decoration: none; }abbr[title] { border-bottom ...

  7. ansible 使用方法

    免密钥方式登陆: [root@yizhen ~]# ssh-keygen -t rsa[root@yizhen ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub 192.168 ...

  8. 18.Android之SharedPreferences数据存储学习

    SharedPreferences是Android中最容易理解的数据存储技术,实际上SharedPreferences处理的就是一个key-value(键值对)SharedPreferences常用来 ...

  9. Linux虚拟地址空间布局

    在多任务操作系统中,每个进程都运行在属于自己的内存沙盘中.这个沙盘就是虚拟地址空间(Virtual Address Space),在32位模式下它是一个4GB的内存地址块.在Linux系统中, 内核进 ...

  10. codevs1500 后缀排序

    题目描述 Description 天凯是MIT的新生.Prof. HandsomeG给了他一个长度为n的由小写字母构成的字符串,要求他把该字符串的n个后缀(suffix)从小到大排序. 何谓后缀?假设 ...