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