华为od机试 启动多任务排序 JS实现
1.题目描述:
一个应用启动时,会有多个初始化任务需要执行,并且任务之间有依赖关系,例如A任务依赖B任务,那么必须在B任务执行完成之后,才能开始执行A任务。
现在给出多条任务依赖关系的规则,请输入任务的顺序执行序列,规则采用贪婪策略,即一个任务如果没有依赖的任务,则立刻开始执行,如果同时有多个任务要执行,则根据任务名称字母顺序排序。
例如: B任务依赖A任务,C任务依赖A任务,D任务依赖B任务和C任务,同时,D任务还依赖E任务。那么执行任务的顺序由先到后是:A任务,E任务,B任务,C任务,D任务。这里A和E任务都是没有依赖的,立即执行
那么输入为:"B->A C->A D->B D->C D->E" 输出结果为“A E B C D”
输入描述
输入参数每个元素都表示任意两个任务之间的依赖关系,输入参数中符号”->”表示依赖方向。
例如A->B表示A依赖B,多个依赖之间用单个空格分割
输出描述
输出为排序后的启动任务列表,多个任务之间用单个空格分割。
之前做的一道机试题,测试数据过了,用例一个没过,太难了,没有一点思路。有大佬能用js实现吗?
一个应用启动时,会有多个初始化任务需要执行,并且任务之间有依赖关系,例如A任务依赖B任务,那么必须在B任务执行完成之后,才能开始执行A任务。
现在给出多条任务依赖关系的规则,请输入任务的顺序执行序列,规则采用贪婪策略,即一个任务如果没有依赖的任务,则立刻开始执行,如果同时有多个任务要执行,则根据任务名称字母顺序排序。
例如: B任务依赖A任务,C任务依赖A任务,D任务依赖B任务和C任务,同时,D任务还依赖E任务。那么执行任务的顺序由先到后是:A任务,E任务,B任务,C任务,D任务。这里A和E任务都是没有依赖的,立即执行
那么输入为:"B->A C->A D->B D->C D->E" 输出结果为“A E B C D”
输入描述
输入参数每个元素都表示任意两个任务之间的依赖关系,输入参数中符号”->”表示依赖方向。
例如A->B表示A依赖B,多个依赖之间用单个空格分割
输出描述
输出为排序后的启动任务列表,多个任务之间用单个空格分割。
全部评论
let str = 'B->A C->A D->B D->C D->E' //[A-B] [A-C] [B-D] [C-D] [E-D]
//[A,E][B,C][D]
let list = str.split(' ')
list = list.map(item=> item.split('->').reverse())
let result = [[]]
list.forEach( item=> {
let start = item[0]
let end = item[1]
let index1 = result.findIndex( item => { return item.includes(start)})
let index2 = result.findIndex( item => { return item.includes(end)})
//start和end都不存在
if(index1 == -1 && index2 == -1){
result[0].push(start)
if(!result[1]){
result[1] = []
}
result[1].push(end)
}else if( index1 == -1 && index2 > -1) { //start不存在 end存在
result[0].push(start)
}else if( index1 > -1 ) { //start存在
result = result.map( item => item.filter(el=> el!=end)) //去掉end 再插入end
if(!result[index1+1]){
result[index1+1] = []
}
result[index1+1].push(end)
}
})
let arr = []
result.forEach( item => {
arr = [...arr, ...item.sort()]; //同一层级默认字母排序
})
console.log(arr.join(' '))
相关推荐

点赞 评论 收藏
分享
02-20 16:25
蚌埠坦克学院 安全工程师 点赞 评论 收藏
分享