问题
假设一个活动中,有 n 个(n的范围是 1<n<10)
场次,场次按时间顺序依次进行。
其中每个场次有三种状态:「未开始」、「进行中」、「已结束」
要求:以当前时间点为参考点,从场次列表中获取最多 4 个场次。
场次具体要求如下:
- 不满足 4 场次或正好 4 场次的全部返回。
- 大于 4 场次时,获取的四个场次有下面这些情况(场次充足的情况下,只有一个【已结束】的场次):
【未开始、未开始、未开始、未开始】
【已结束、未开始、未开始、未开始】
【已结束、进行中、未开始、未开始】
…
解决文案:
突破点
找到【已结束】的下标,并以此下标为中心来推断其它几个场次。
具体解决步骤
- 少于 4 场次,全部返回;
- 多余 4 场次,按以下规则取
设:index 为最后一个已结束的场次下标,size 为场次列表数量,hasNext 为是否有下一个场次
<1. 如果:index=-1 时,表示都没结束,取前 4 个;hasNext=true
<2. 如果:size-index<=4 时,表示未结束的不多了,取后 4 个;hasNext=false
<3. 否则:取 index、index+1、index+2、index+3;hasNext=true
示例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| public class Test {
private static final int MAX_SCENE_SIZE = 4;
private Result getResult(List<SceneModel> candidateSceneList) { Result result = new Result(); final int size = candidateSceneList.size();
if (size <= MAX_SCENE_SIZE) { result.setHasNext(false); result.setSceneList(candidateSceneList); return result; }
List<SceneModel> resultList;
int index = getLastFinishedSceneIndex(candidateSceneList);
if (index == -1) { resultList = candidateSceneList.subList(0, MAX_SCENE_SIZE); result.setSceneList(resultList); result.setHasNext(true); return result; }
if (size - index <= MAX_SCENE_SIZE) { resultList = candidateSceneList.subList(size - MAX_SCENE_SIZE, size); result.setSceneList(resultList); result.setHasNext(false); return result; }
resultList = candidateSceneList.subList(index, index + MAX_SCENE_SIZE); result.setSceneList(resultList); result.setHasNext(true); return result; } }
|