JAVA-- M选N的组合算法
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的组合算法的更多相关文章
- [整] JavaScript m选n组合算法
01转换法: 思路是开一个数组,其下标表示1到m个数,数组元素的值为1表示其下标代表的数被选中,为0则没选中. 首先初始化,将数组前n个元素置1,表示第一个组合为前n个数. 然后从左到右扫描数组元素值 ...
- 获取所有组合算法、获取全排列算法(java)
转载声明:原文转自:http://www.cnblogs.com/xiezie/p/5574516.html 受到ACM1015的影响,个人感觉,有必要对统计学上的 全组合和全排列 进行一个简单的总结 ...
- Java面试宝典(5)算法
二.算法与编程 1.编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔. 答: pack ...
- 关于Java中的继承和组合的一个错误使用的例子
[TOC] 关于Java中的继承和组合的一个错误使用的例子 相信绝大多数人都比较熟悉Java中的「继承」和「组合」这两个东西,本篇文章就主要就这两个话题谈论一下.如果我某些地方写的不对,或者比较幼稚, ...
- Adaboost\GBDT\GBRT\组合算法
Adaboost\GBDT\GBRT\组合算法(龙心尘老师上课笔记) 一.Bagging (并行bootstrap)& Boosting(串行) 随机森林实际上是bagging的思路,而GBD ...
- 排列组合算法(PHP)
用php实现的排列组合算法.使用递归算法,效率低,胜在简单易懂.可对付元素不多的情况. //从$input数组中取$m个数的组合算法 function comb($input, $m) { if($m ...
- <Java中的继承和组合之间的联系和区别>
//Java中的继承和组合之间的联系和区别 //本例是继承 class Animal { private void beat() { System.out.println("心胀跳动...& ...
- C#语法灵活运用之排列组合算法
今天群里有朋友求一个排列组合算法,题目是给定长度,输出所有指定字母的组合. 如指定字母a.b.c.d.e.f,长度为2,则结果应为:aa.ab.ac ... ef.ff. 有朋友给出算法,很有特色: ...
- Lua版组合算法
高效率的排列组合算法--<编程珠矶>--Lua实现 原文链接 原文是python实现的,这里给出lua版本的实现 组合算法 本程序的思路是开一个数组,其下标表示1到m个数,数组元素 ...
随机推荐
- Object C学习笔记14-分类(category)
在.NET中有一个非常带劲的特性,那就是扩展方法. 扩展方法使你能够向现有类型“添加”方法(包括你自定义的类型和对象噢),而无需创建新的派生类型.重新编译或以其他方式修改原始类型.扩展方法是一种特殊的 ...
- [BZOJ 2186][Sdoi2008]沙拉公主的困惑(欧拉函数)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2186 分析: 就是要求1~n!中与m!互质的数的个数 首先m!以内的就是φ(m!) 关 ...
- HDU 1171 Big Event in HDU 多重背包二进制优化
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1171 Big Event in HDU Time Limit: 10000/5000 MS (Jav ...
- .net架构设计读书笔记--第二章 第7节 神化般的业务层
一.编排业务逻辑的模式1. 事务脚本模式TS(The Transaction Script pattern ) TS模式概述 TS 鼓励你跳过任何的面向对象的设计,你直接到所需的用户操作的业务 ...
- bugzilla_firefox
//本来要给火狐提交bug的,发现复现不鸟,我勒个去 <!doctype html> <html> <head> <meta charset="ut ...
- [Asp.net mvc]实体更新异常:存储区更新、插入或删除语句影响到了意外的行数(0)。实体在加载后可能被修改或删除。
学习asp.net mvc 时在更新实体进行SaveChanges()的时候出现了异常,异常如下: “/”应用程序中的服务器错误. 存储区更新.插入或删除语句影响到了意外的行数(0).实体在加载后可能 ...
- POJ3579 Median
Description Given N numbers, X1, X2, ... , XN, let us calculate the difference of every pair of numb ...
- BZOJ1036 树的统计
Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. Q ...
- JSP登录验证并显示信息
加入C标签: 加入jstl.jar 和standard.jar加入Lib文件夹中 将c.tld放入WEB-Info文件夹中 index.jsp <%@ page language="j ...
- android中Handle类的用法
android中Handle类的用法 当我们在处理下载或是其他需要长时间执行的任务时,如果直接把处理函数放Activity的OnCreate或是OnStart中,会导致执行过程中整个Activity无 ...