华为OD机试一二题

本文介绍了如何使用编程解决两个实际问题:一是通过策略选择优化多人任务完成时间,二是计算给定数组中众数组成的数组的中位数。通过实例展示了如何利用Java实现这两个算法,适用于信息技术领域的项目管理和数据分析。
摘要由CSDN通过智能技术生成

第一题

任务描述:
每一个任务有三种策略 resA、resB、resC,每一种策略都对应一个完成该任务的时间,现在输入人数和每一个人的任务所用的三种策略的时间。
1.从第一个人依次选择三个策略中耗时最少的策略
2.相邻人不能选用同一种策略
3.若同一任务有策略耗时相同,则选择最后的策略
求所有人完成任务的耗时
输入用例:
3
5 7 9
6 1 3
4 2 8
输出用例:
10

// 本题为考试多行输入输出规范示例,无需提交,不计分。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[][] res = new int[n][3];
        for(int i = 0; i < n; i++){
            for(int j = 0; j < 3; j++){
                res[i][j] = sc.nextInt();
            }
        }
        int count = 0;
        int index = 0;
        int[] array = new int[3];
        ArrayList<Integer> arrayList = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            if(i==0){

                for (int j = 0; j < 3; j++) {
                    array[j] = res[i][j];
                }
                Arrays.sort(array);
                for (int j = 0; j < 3; j++) {
                    if(array[0] == res[i][j]){
                        //获得该用户选择的策略
                        index = j;
                    }
                }
                count = count + array[0];
            }else{
                //拿到该用户的三种资源消耗并将上一个用户选择的策略排除
                for (int j = 0; j < 3; j++) {
                    if(j!=index){
                        arrayList.add(res[i][j]);
                    }
                }
                if(arrayList.get(0) >= arrayList.get(1)){
                    count = count + arrayList.get(1);
                    for (int j = 0; j < 3; j++) {
                        if(arrayList.get(1) == res[i][j]){
                            //获得该用户选择的策略
                            index = j;
                        }
                    }
                }else {
                    count = count + arrayList.get(0);
                    for (int j = 0; j < 3; j++) {
                        if(arrayList.get(0) == res[i][j]){
                            //获得该用户选择的策略
                            index = j;
                        }
                    }
                }
                arrayList.clear();
            }
        }
        System.out.println(count);
    }
}

```java
在这里插入代码片

**

第二题

任务描述:求一个数组中众数组成的新数组的中位数
输入用例:1 2 2 3 4 4 5 5 9 5
输出用例:4

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;

public class Main1 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        ArrayList<Integer> array = new ArrayList<>();
        ArrayList<Integer> arrayList = new ArrayList<>();
        while (input.hasNext()){
            String[] strs = input.nextLine().split(" ");
            //获得初始数组
            for (int i = 0; i < strs.length; i++) {
                array.add(Integer.parseInt(strs[i]));
            }
            //记录每个数字出现的个数
            int count = 0;
            for (int i = 0; i < array.size(); i++) {
                for (int j = i; j < array.size(); j++) {
                    if(array.get(i).equals(array.get(j))){
                        count++;
                    }
                }
                //获得众数数组
                if(count > 1 && !arrayList.contains(array.get(i))){
                    arrayList.add(array.get(i));
                }
                count = 0;
            }
                Integer[] newArray = arrayList.toArray(new Integer[arrayList.size()]);
                //对新数组排序
                Arrays.sort(newArray);
                for (int i = 0; i < newArray.length; i++) {
                    System.out.println(newArray[i]);
                }
                int index;
                if ((newArray.length) % 2 != 0) {
                    index = newArray.length / 2;
                    System.out.println(newArray[index]);
                } else {

                    float result = (float) (newArray[(newArray.length-1)/2] + newArray[(newArray.length-1)/2+1])/2;
                    System.out.println(result);
                }
                array.clear();
                arrayList.clear();
        }
    }
}

**

  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值