面试真题给定一个List<Double>num,每个元素的值随机从[0,1]取,请用2个线程分别计算num的均值和中位数;要求并行执行,等到两个线程都执行完毕后,取均值和中位数的最大值作为输出

Posted Cry丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试真题给定一个List<Double>num,每个元素的值随机从[0,1]取,请用2个线程分别计算num的均值和中位数;要求并行执行,等到两个线程都执行完毕后,取均值和中位数的最大值作为输出相关的知识,希望对你有一定的参考价值。

给定一个List<Double> num,num.size()为0xFFFF,每个元素的值随机从[0,1]取,请用2个线程分别计算num的均值和中位数; 要求这两个线程是并行执行(注意不是顺序执行,即"不是"一个线程执行完毕再执行第二个线程),等到两个线程都执行完毕后,取均值和中位数的最大值作为输出。

我们选用的 OpenJDK 14 最新环境,你的 java 代码会传送至 ShowMeBug 提供的该环境中。

你必须定义一个 ShowMeBug 类和 public static void main(String[] args) 方法,这样我们才能运行出结果。

一个简单的例子:

public class ShowMeBug 
  public static void main(String[] args) 
    System.out.println("Hello World!");
  

你可以使用下面的库:

import java.io.*;
import java.util.*;
import java.math.*;
import java.util.regex.*;
import java.util.stream.*;
import java.text.*;
import java.security.SecureRandom;
import java.util.function.*;
import java.util.concurrent.*;
import com.fasterxml.jackson.core.*;
import com.fasterxml.jackson.core.type.*;
import com.fasterxml.jackson.databind.*;

参考代码:

class Solution 

    private static CountDownLatch latch = new CountDownLatch(2);

    // List<Double> = [0.1,0.2,0.3,0.4,0.5,0.6,0.7]
    public static double solution(List<Double> num) 
        CountMeanThread countMeanThread =  new CountMeanThread(num,latch);
        countMeanThread.start();
        CountMidThread countMidThread =  new CountMidThread(num,latch);
        countMidThread.start();
        // 等待门栓countdown到0,放行
        try 
            latch.await();
         catch (InterruptedException e) 
            e.printStackTrace();
        
        return Math.max(countMeanThread.mean,countMidThread.mid);
    


class CountMeanThread extends Thread 

    List<Double> num;

    double sum = 0.0;

    double mean = 0.0;

    CountDownLatch latch;

    public CountMeanThread(List<Double> num,CountDownLatch latch)
        this.num = num;
        this.latch = latch;
    

    @Override
    public void run()
        for(int i = 0;i < num.size();i++)
            sum = sum + num.get(i);
        
        mean = sum / num.size();
        latch.countDown();
        System.out.println("mean: " + mean);
    


class CountMidThread extends Thread 

    List<Double> num;

    double sum = 0.0;

    double mid = 0.0;

    CountDownLatch latch;

    public CountMidThread(List<Double> num,CountDownLatch latch)
        this.num = num;
        this.latch = latch;
    

    @Override
    public void run()
        for(int i = 0;i < num.size();i++)
            sum = sum + num.get(i);
        
        // 对list排序,中位数就是num[num.length/2];
        Arrays.sort(new List[]num);
        mid = num.get(num.size() / 2);
        System.out.println("mid: " + mid);
        latch.countDown();
    


class ShowMeBug 
    public static void main(String[] args) 
        System.out.println("Hello World!");
        List<Double> num =  new ArrayList(10);
        num.add(0.1);
        num.add(0.2);
        num.add(0.3);
        num.add(0.7);
        num.add(0.9);
        System.out.println("Hello World!");
        double maxNum = Solution.solution(num);
        System.out.println("maxNum: " + maxNum);
    

以上是关于面试真题给定一个List<Double>num,每个元素的值随机从[0,1]取,请用2个线程分别计算num的均值和中位数;要求并行执行,等到两个线程都执行完毕后,取均值和中位数的最大值作为输出的主要内容,如果未能解决你的问题,请参考以下文章

面试真题给定3个班级,班级id号分别为c1,c2,c3,随机生成一个List<Student> students,每个班级的score和classId均随机,输出每个班级里学生的平均成绩

面试真题给定3个班级,班级id号分别为c1,c2,c3,随机生成一个List<Student> students,每个班级的score和classId均随机,输出每个班级里学生的平均成绩

面试真题设计一个抢红包算法,单个红包最大不能超过总金额的90%

面试真题设计一个抢红包算法,单个红包最大不能超过总金额的90%

LeetCode真题349:给定两个数组,编写一个函数来计算它们的交集。

华为机试真题 C++ 实现等和子数组最小和2022.11 Q4新题