一、题目描述
任务编排服务负责对任务进行组合调度。参与编排的任务有两种类型,其中一种执行时长为taskA,另一种执行时长为taskB。任务一旦开始执行不能被打断,且任务可连续执行。服务每次可以编排num个任务。请编写一个方法,生成每次编排后的任务所有可能的总执行时长。
二、输入输出描述
输入描述
- 第一行:三个整数
taskA、taskB、num(逗号分隔)。
备注:
- taskA:第1种任务执行时长
- taskB:第2种任务执行时长
- num:编排的任务个数num
- 0 < taskA 0 < taskB 0 <= num <= 100000
- 每种任务的数量都大于本次可以编排的任务数量
输出描述
- 每种任务的数量都大于本次可以编排的任务数量。
三、示例
| 输入 |
1,2,3 |
| 输出 | [3, 4, 5, 6] |
| 说明 |
四、解题思路
1. 核心思想
通过遍历所有可能的组合系数i,计算目标表达式的值,利用TreeSet的 “自动去重 + 升序排列” 特性,无需手动处理重复值和排序,直接得到有序且唯一的结果集合 —— 核心是 “遍历枚举所有组合 + 有序集合简化后处理”。
2. 问题本质分析
- 表层问题:计算
i从 0 到count时,tA*i + tB*(count-i)的所有可能值,要求去重并按升序输出; - 深层问题:
- 组合枚举:
i的取值范围是 0 到count的整数,需覆盖所有可能的组合; - 结果去重:不同
i可能计算出相同值(如tA=tB时),需剔除重复; - 结果排序:要求输出升序的结果,需对计算值排序;
- 边界处理:
count=0时无有效计算结果,需返回空数组格式。
- 组合枚举:
3. 核心逻辑
- 枚举所有可能:遍历
i从 0 到count,计算每个i对应的表达式值,确保覆盖所有组合; - 容器特性复用:使用
TreeSet存储计算值,利用其 “添加时自动去重、默认升序排列” 的特性,省去手动去重(如用HashSet后再排序)和排序的步骤; - 边界特殊处理:
count=0时直接返回空数组格式,避免无效遍历。
4. 步骤拆解
-
输入解析:
- 读取逗号分隔的输入字符串,分割并转换为
tA、tB、count三个整数。
- 读取逗号分隔的输入字符串,分割并转换为
-
边界判断:
- 若
count=0,直接返回[],无需后续计算。
- 若
-
枚举计算 + 去重排序:
- 初始化
TreeSet容器; - 遍历
i从 0 到count,计算tA*i + tB*(count-i)并加入TreeSet(自动去重 + 升序)。
- 初始化
-
结果输出:
- 调用
TreeSet的toString()方法,直接输出有序、去重的结果字符串(格式为[值1, 值2, ...])。
- 调用
五、代码实现
import java.util.Set;
import java.util.TreeSet;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
// 读取输入并分割为 tA, tB 和 count
String[] data = input.nextLine().split(",");
int tA = Integer.parseInt(data[0]); // tA的值
int tB = Integer.parseInt(data[1]); // tB的值
int count = Integer.parseInt(data[2]); // count的值
// 输出计算的结果
System.out.println(calcTimes(tA, tB, count));
}
// 计算所有可能的时间值
public static String calcTimes(int tA, int tB, int count) {
// 如果 count 为 0,直接返回空数组表示没有结果
if (count == 0) return "[]";
// 使用 TreeSet 来自动去重并按升序排列
Set<Integer> times = new TreeSet<>();
// 计算 i 从 0 到 count 的所有可能的 tA * i + tB * (count - i)
for (int i = 0; i <= count; i++) {
times.add(tA * i + tB * (count - i));
}
// 返回 TreeSet 的字符串表示,即集合中的所有元素按升序排列
return times.toString();
}
}
3626

被折叠的 条评论
为什么被折叠?



