梳理课程推荐代码

写需求的时候规则一直在变化,导致带上了业务的代码十分杂乱,趁着有空了单独拎出来梳理一遍。

class Solution{
        /**
         * 推荐三份满足课时的课程列表
         * 要求:课程目标时长为k,优先推荐课程为high,普通课程为normal,
         * 优先选择推荐课程,从头到尾依次推荐(首尾循环),不足的时长由普通课程补足,普通课程也依次推荐(首尾循环),当全部推荐完后依然不满足时长不重新循环。
         * 三份课程的推荐课程数依次减少三分之一(向上取整),且下一份课程的开始位置位于上一份课程结束位置的下一个。
         *
         * @param k  目标课时
         * @param high  优先推荐课程
         * @param normal  普通课程
         * @return  三份推荐课程
         */
        public List<List<BigDecimal>> rebuildCount(BigDecimal k,List<BigDecimal> high,List<BigDecimal> normal){
            List<List<BigDecimal>> result = new ArrayList<>();
            int highLength = high.size();
            int normalLength = normal.size();
            int lHindex = 0;    //初始化推荐课程开始位置
            int rHindex;    //初始化推荐课程结束位置
            int nindex = 0;    //初始化普通课程索引
            int nNum;    //初始化普通课程添加数量,记录遍历数量判断是否已遍历

            //循环三份
            for(int i = 1;i <= 3;i++){
                //定义学时
                BigDecimal xs = new BigDecimal(0);

                nNum = 0;
                List<BigDecimal> temp = new ArrayList<>();
                //标记优先推荐课程结束位置:开始位置 + 推荐数量
                rHindex = lHindex + (highLength - ((int)Math.ceil((double)highLength / 3)) * (i - 1));
                if (rHindex > highLength) //若结束标记位置大于长度,取模。此处结束标记可等于长度。
                    rHindex = rHindex % highLength;
                do{
                    //判断是否进入推荐课程
                    if(highLength > 0 && lHindex != rHindex){
                        lHindex = lHindex % highLength; //防止越界
                        xs = xs.add(high.get(lHindex));
                        temp.add(high.get(lHindex++));
                    }else if(normalLength > 0 && nNum < normalLength){
                        nindex = nindex % normalLength;
                        xs = xs.add(normal.get(nindex));
                        temp.add(normal.get(nindex++));
                        nNum++;
                    }else{
                        //都不满足说明没课了,退出循环
                        break;
                    }
                }while (xs.compareTo(k) < 0);
                result.add(temp);
            }
            return result;
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值