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. [bzoj2245][SDOI2011]工作安排(费用流)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2245 分析: 要注意到题目下面说的w是单增的 明显的费用流: 弄个源点S,汇点T S连 ...

  2. ThinkPHP之MVC与URL访问

    一.初探 我们在apache的www目录下创建一个文件夹,其命名为我们的应用名.然后通过入口文件生成我们的应用. 当我们用ThinkPHP创建好一个应用后,其目录结果如下所示 那么我们如何来访问我们应 ...

  3. [Aaronyang] 写给自己的WPF4.5 失传的第一本古老秘籍[多扩展显示器编程]

    世界上只有想不通的人,没有走不通的路 --Aaronyang的博客(www.ayjs.net)-www.8mi.me =============时隔两年后再看WPF,有些秘籍不太适合公开,公开了就不值 ...

  4. WCF入门 (13)

    前言 公司略无聊,周三前同事推荐跳槽,于是会去更新了一下简历,突然发现,快一年了,我竟然想不出我可以往简历上添加点什么值得自豪的东西.下午和小伙伴聊了一会天,他告诉我,可以往简历上写上“英语口语水平有 ...

  5. 自定义的 ListBoxItem 自适应ListBox的宽度

    主要是要设置HorizontalContentAlignment的值,而不是HorizontalAlignment <ListBox x:Name="xxx"> < ...

  6. Action+Service +Dao三层的功能划分

    来源:http://blog.csdn.net/inter_peng/article/details/41021727 1. Action/Service/DAO简介: Action是管理业务(Ser ...

  7. oracle练习题后15个

    31,32题更正: SQL> --31. 查询所有教师和同学的name.sex和birthday. SQL> select sname, ssex, sbirthday from stud ...

  8. 前端筑基篇(一)->ajax跨域原理以及解决方案

    说明 跨域主要是由于浏览器的“同源策略”引起,分为多种类型,本文主要探讨Ajax请求跨域问题 前言 参考来源 什么是跨域 ajax跨域的表现 跨域的原理 如何解决跨域问题 JSONP方式解决跨域问题 ...

  9. 关于ActionContext.getContext()的用法

    为了避免与Servlet API耦合在一起,方便Action类做单元测试,Struts 2对HttpServletRequest.HttpSession和ServletContext进行了封装,构造了 ...

  10. unix/linux进程详解

    技术分享 启动新进程 stdlib.hintsystem(const char *string)whichequals to "sh -c string" 替换进程映像unistd ...