8强,16强,32强,64强,128强 分组算法

    /**
     * 排序根据为:
     * 排名最靠前的玩家,需要进入到最后的决赛,
     * 所以,需要把最强的和最弱的玩家在前面开打,
     * 那么,最强和最强的就会进入到后面决赛。
     *
     * @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 显示为:

 这是一种比较极限的分组方式。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值