package com.zz.myapplication; import java.util.ArrayList; import java.util.List; /** * Created by zhouzhuo on 16/1/31. */ public class Utils { /** * 实现的算法 任选九 * * @param a * 数据数组 * @param num * M选N中 N的个数 * @return */ public static List<List<Integer>> combine(int[] a, int num) { List<List<Integer>> list = new ArrayList<List<Integer>>(); if (a.length < num) { return list; } int[] b = new int[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; int temp = 1; while (true) { // 判断是否全部移位完毕 for (int i = b.length - 1; i >= b.length - num; i--) { if (b[i] == 1) sum += 1; } // 根据移位生成数据 List<Integer> childList = new ArrayList<Integer>(); for (int i = 0; i < b.length; i++) { if (b[i] == 1) { childList.add(a[i]); point = i; count++; if (count == num) break; } } // 往返回值列表添加数据 list.add(childList); // 当数组的最后num位全部为1 退出 if (sum == num) { break; } sum = 0; // 修改从左往右第一个10变成01 for (int i = 0; i < b.length - 1; i++) { if (b[i] == 1 && b[i + 1] == 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] == 0) { temp = b[i]; b[i] = b[j + 1]; b[j + 1] = temp; } } count = 0; } return list; } }
调用结果
int[] a = {1,3,4,5,7}; List<List<Integer>> list =Utils.combine(a,4); for(int i = 0;i<list.size();i++){ Log.e("zhouzhuo","list==="+i+"==="+list.get(i).toString()); }
输出结果:
E/zhouzhuo: list===0===[1, 3, 4, 5] E/zhouzhuo: list===1===[1, 3, 4, 7] E/zhouzhuo: list===2===[1, 3, 5, 7] E/zhouzhuo: list===3===[1, 4, 5, 7] E/zhouzhuo: list===4===[3, 4, 5, 7]