/**
* 排序根据为:
* 排名最靠前的玩家,需要进入到最后的决赛,
* 所以,需要把最强的和最弱的玩家在前面开打,
* 那么,最强和最强的就会进入到后面决赛。
*
* @param top 排多少强,
* @return
*/
public static List<Integer> grouping(int top) throws IllegalArgumentException {
if (!canGrouping(top)) {
throw new IllegalArgumentException("(" + top + ") Not to the power of 2");
}
// 需要打几轮
int count = Integer.toBinaryString(top).length();
List<Integer> list = new ArrayList<>();
list.add(1); // 默认添加 位置1 到第一个位置
for (int i = 1; i < count; i++) {
int max = Double.valueOf(Math.pow(2, i)).intValue() + 1;
list = addIndex(list, max);
}
return list;
}
/** 填充位置信息 */
private static List<Integer> addIndex(List<Integer> list, int max) {
var tmp = new ArrayList<Integer>();
for (var val : list) {
tmp.add(val);
tmp.add(max - val);
}
return tmp;
}
/**
* 例如
* a 0100 0000
* a-1 0011 1111
* <p>
* a 0100 1000
* a-1 0100 0111
* 分别进行与运算,如果是2的n次幂,则与结果为false。即运行结果为false的数,即不是2的n次幂,ture则是2的n次幂。
*
* @param num
* @return
*/
public static boolean canGrouping(int num) {
if (num < 2) {
return false;
}
return (num & (num - 1)) == 0;
}
测试代码:
public static void main(String[] args) {
var list2 = grouping(2);
var list4 = grouping(4);
var list8 = grouping(8);
var list16 = grouping(16);
var list32 = grouping(32);
var list64 = grouping(64);
var list128 = grouping(128);
showList(list2);
showList(list4);
showList(list8);
showList(list16);
showList(list32);
showList(list64);
showList(list128);
}
public static void showList(List list) {
for (var obj : list) {
System.out.print(obj);
System.out.print(",");
}
System.out.println();
}
Excel 显示为:
这是一种比较极限的分组方式。