需求:
总核:16 已用核:['1', '3-5', '8'] 求未用的核数即 :求 ['0', '2', '6-7', '9-15']
思路:
1. 将总核、已用核都转化成数组形式
2. 从总核数组中删除已用核,得到未用核数组
3. 将未用核数组转化成区间集合
实现:
//区间转化成一个数组 '3-5' -> [3,4,5]
const generateArry=(start:number,end:number)=>{
return Array.from(new Array(end+1).keys()).slice(start);
};
//封成一个函数
const UnUse=(n:number,target:string[])=>{
let cpuList=[...new Array(n).keys()] //ES6不用循坏快速创建从0到N的数组的
//区间集合=>数组集合
for(let i=cupList.length-1;i>=0;i--){
for(let j=0; j<target.length; j++){
//判断是单个的核,还是核区间
if(target[j].indexOf('-')!== -1){ //indexOf 返回数组中的下标
//存在区间
let segment=generateArry(parseInt(target[j].split('-')[0]),parseInt(target[j].split('-')[1]));
for(let k=0; k<segment.length;k++){
if(cpuList[i]===segment[k]){
cpuList.splice(i,1);
continue;
}
}
}else{
//单个核
if(cpuList[i]===parseInt(target[j])){
cpuList.splice(i,1);
continue;
}
}
}
}
//数组集合->区间集合 [0,2,6,7,9,10,11,12,13,14,15] -> ['0', '2', '6-7', '9-15']
let result=[];
let p=0;
let cpus:sting[]=[];
const list = cupList.sort((a,b)=>a-b);
list.forEach((item,index)=>{ //将有序的数合并成一个数组 -> [[0],[2],[6,7],[9,10,11,12,13,14,15]]
if(index===0){
result[0]=[item];
}else if(item-List[index-1]===1){
result[p].push(item); //连续的放一块
}else{
result[++i]=[item]; //开辟新空间
}
});
// 集合变成区间字符串 -> ['0', '2', '6-7', '9-15']
result.forEach((element)=>{
if(element.length>1){
cpus.push(element[0]+'-'+element[element.length-1]);
}else{
cpus.push(element.toString());
}
});
return cpus;
}
相关资料:
js将数组中的连续数字分组_天蒙蒙亮的博客-CSDN博客_js连续数字