高性能的AI处理器
题目:某公司研发一款高性能AI处理器,每台物理设备具备8颗AI处理器,编号0,1,2,3,4,5,6,7,编号0-3的处理器在同一链路中,编号4-7的处理器在另一链路中,不同链路中处理器不能通信。现给定服务器可用处理器编号数组array,以及任务申请的处理器数量num,找出符合下列亲和协调度原则的芯片组合,若不存在,则返回空列表。
亲和协调原则如下:1,如果申请处理器个数为1,则选择同一链路,剩余可用度处理器数量为1个最佳,剩余3个为次佳,然后是剩余2个,最后是剩余4个。 2,如果申请的处理器个数为2个,则选择同一链路剩余可用的处理器数量为2个最佳,其次是4个,最后是剩余3个。 3,如果申请的处理器个数为4个,则必须选择同一个链路,剩余可用的处理器数量为4个。4,如果申请的处理器个数为8个,则申请节点所有8个处理器。 提示:1,任务申请的处理器数量只能是1,2,4,8; 2,编号0-3的处理器处于同一个链路,4-7处于另一个链路。3,处理器编号唯一,且不存在相同编号处理器。输入包含可用的处理器编号数组array,以及任务申请的处理器数量num;
示例1
输入:
[0,1,4,5,6,7]
1
输出:
[[0],[1]]
示例2
输入:
[0,1,4,5,6,7]
4
输出:
[4,5,6,7]
代码如下:
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int[] array= Arrays.stream(scan.nextLine().split(",")).mapToInt(Integer::parseInt).toArray();
int num = scan.nextInt();
List<List<Integer>> result = findProcessorCombination(array,num);
System.out.println(result);
}
private static List<List<Integer>> findProcessorCombination(int[] array, int num) {
List<Integer> list0 = new LinkedList<>();
List<Integer> list1 = new LinkedList<>();
for(int i=0;i< array.length;i++){
if(array[i] >=0 && array[i] <4){
list0.add(array[i]);
}else {
list1.add(array[i]);
}
}
switch (num){
case (1):return handleNum1(list0,list1);
case (2):return handleNum2(list0,list1);
case (4):return handleNum4(list0,list1);
case (8):return handleNum8(array);
default:return new LinkedList<>();
}
}
private static List<List<Integer>> handleNum1(List<Integer> list0, List<Integer> list1) {
int remain0 = list0.size();
int remain1 = list1.size();
List<List<Integer>> result = new LinkedList<>();
if(remain0 == 2 || remain1 == 2){
if(remain0 == 2){
result.add(new LinkedList<>(list0.subList(0,1)));
result.add(new LinkedList<>(list0.subList(1,2)));
}
if(remain1 == 2){
result.add(new LinkedList<>(list1.subList(0,1)));
result.add(new LinkedList<>(list1.subList(1,2)));
}
}else if((remain0 == 4 ) || (remain1 == 4)){
if(remain0 == 4){
for(int i=0;i< list0.size();i++){
List<Integer> listArray = new LinkedList<>();
listArray.add(list0.get(i));
result.add(listArray);
}
}
if(remain1 == 4){
for(int i=0;i< list0.size();i++){
List<Integer> listArray = new LinkedList<>();
listArray.add(list1.get(i));
result.add(listArray);
}
}
}else if(remain0 == 3 || remain1 == 3){
if(remain0 == 3){
for(int i=0;i< list0.size();i++){
List<Integer> listArray = new LinkedList<>();
listArray.add(list0.get(i));
result.add(listArray);
}
}
if(remain1 == 3){
for(int i=0;i< list0.size();i++){
List<Integer> listArray = new LinkedList<>();
listArray.add(list1.get(i));
result.add(listArray);
}
}
}else {
if(remain0 == 1){
result.add(new LinkedList<>(list0.subList(0,1)));
}
if(remain1 == 1 ){
result.add(new LinkedList<>(list1.subList(0,1)));
}
}
return result;
}
private static List<List<Integer>> handleNum2(List<Integer> list0, List<Integer> list1) {
int remain0 = list0.size();
int remain1 = list1.size();
List<List<Integer>> result = new LinkedList<>();
if(remain0 == 4 || remain1 == 4){
if(remain0 == 4){
result.add(new LinkedList<>(list0.subList(0,2)));
result.add(new LinkedList<>(list0.subList(1,3)));
result.add(new LinkedList<>(list0.subList(2,4)));
Integer[] arr0 = new Integer[]{list0.get(0),list0.get(2)};
Integer[] arr1 = new Integer[]{list0.get(0),list0.get(3)};
Integer[] arr2 = new Integer[]{list0.get(1),list0.get(3)};
result.add(Arrays.asList(arr0));
result.add(Arrays.asList(arr1));
result.add(Arrays.asList(arr2));
}
if(remain1 == 4){
result.add(new LinkedList<>(list1.subList(0,2)));
result.add(new LinkedList<>(list1.subList(1,3)));
result.add(new LinkedList<>(list1.subList(2,4)));
Integer[] arr0 = new Integer[]{list1.get(0),list1.get(2)};
Integer[] arr1 = new Integer[]{list1.get(0),list1.get(3)};
Integer[] arr2 = new Integer[]{list1.get(1),list1.get(3)};
result.add(Arrays.asList(arr0));
result.add(Arrays.asList(arr1));
result.add(Arrays.asList(arr2));
}
}else if(remain0 == 2 || remain1 == 2){
if(remain0 == 2 ){
result.add(new LinkedList<>(list0.subList(0,2)));
}
if( remain1 == 2){
result.add(new LinkedList<>(list1.subList(0,2)));
}
}
return result;
}
private static List<List<Integer>> handleNum4(List<Integer> list0, List<Integer> list1) {
List<List<Integer>> result = new ArrayList<>();
if (list0.size() == 4) result.add(list0);
if (list1.size() == 4) result.add(list1);
return result;
}
private static List<List<Integer>> handleNum8(int[]array) {
List<List<Integer>> result =new LinkedList<>();
if(array.length == 8){
List<Integer> allProcessor = new LinkedList<>();
for(int processor : array){
allProcessor.add(processor);
}
result.add(allProcessor);
}
return result;
}
#笔试##技术岗笔试题求解#
查看10道真题和解析