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. 获取Web.config配置节

    static string GetAppSetting(string key) { var appSetting = ConfigurationManager.AppSettings[key]; if ...

  2. 编写高质量代码改善C#程序的157个建议[泛型集合、选择集合、集合的安全]

    前言   软件开发过程中,不可避免会用到集合,C#中的集合表现为数组和若干集合类.不管是数组还是集合类,它们都有各自的优缺点.如何使用好集合是我们在开发过程中必须掌握的技巧.不要小看这些技巧,一旦在开 ...

  3. 用wcf实现带有“秒传”功能的网盘

    写在前面 前面记录过这样一个关于“秒传”的实现思路,在这篇就弄了一个简单的demo实现了一下,当中有很多业务仍没考虑,只是将“秒传”的实现思路,用代码实现了一下. 关于秒传,可以参考这篇文章:何为“秒 ...

  4. 第四课:seajs的模块编译_compile过程

    最近比较闲,我就讲下seajs的模块编译_compile过程. 这里紧接着第三课的例子来讲解.首先是a.js的编译 Module.prototype._compile = function() { 1 ...

  5. DOM(六)事件类型

    对于用户事件类型而言,最常用的是鼠标.键盘.浏览器. 1.鼠标事件: 鼠标的事件都频繁使用,下面例子就测试各种鼠标事件 <script language="javascript&quo ...

  6. 第二章:javascript: 数组

    数组是编程世界里最常见的数据结构.任何一种编程语言都包含数组,只是形式稍微有差异.数组是编程语言中的内建类型,通常效率都很高.可以满足不同需求的数据存储,本章将探索javascript中的数组工作原理 ...

  7. Andriod开发环境的发展演变

    安卓早先只能使用JAVA开发应用程序,现在支持多种编程语言,方便了许多程序员,但主流的应该还是JAVA语言.早先安卓开发经常用到eclipse,但自从google 发布了Android studio后 ...

  8. 使用Owin中间件搭建OAuth2.0认证授权服务器

    前言 这里主要总结下本人最近半个月关于搭建OAuth2.0服务器工作的经验.至于为何需要OAuth2.0.为何是Owin.什么是Owin等问题,不再赘述.我假定读者是使用Asp.Net,并需要搭建OA ...

  9. zoj3882 博弈

    我理解错题目意思,稀里糊涂A了.其实就是先手必胜. #include<stdio.h> int main() { int n; while(scanf("%d",&am ...

  10. Throwable和Exception的区别

    Java语言要求java程序中(无论是谁写的代码)所有抛出(throw)的异常都必须是从Throwable派生而来.当然,实际的Java编程中,由于JDK平台已经为我们设计好了非常丰富和完整的异常对象 ...