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/