【问题标题】:Find maximum score or the maximum average score of candidate scores given in two dim array查找两个dim数组中给出的候选分数的最大分数或最大平均分数
【发布时间】:2018-06-06 08:12:28
【问题描述】:

问题:考生可以根据自己的意愿多次参加入学考试。最后考虑所有尝试的平均分数。给定分数列表。找到得分最高的候选人[平均分]。

String scores[][] = {{"Ram","155"}, 
                    {"Shyam","145"},
                    {"Ram","156"},
                    {"Balram","159"},
                    {"Balram","150"},
                    {"Ram","135"},
                    {"Mira","156"},
                    {"Mira","152"},
                    {"Shyam","155"}};

分数以上述二维数组的形式给出。需要建议以有效的方式解决此问题。

【问题讨论】:

  • “需要改进时间复杂度和空间复杂度的建议。”你认为这段代码的时间和空间复杂度是多少;为什么你认为他们需要改进,而不是这段代码的其他方面;你怎么知道它们可以改进?
  • 我认为时间和空间复杂度是 O(m + n ),其中 m 是候选人的数量,n 是候选人的最大尝试次数。我使用 2 个循环来做到这一点,应该有更好的解决方案。所以寻求建议。

标签: java arrays arraylist data-structures java-stream


【解决方案1】:

降低时间和空间复杂度的原因是什么?我坚信简洁性和可维护性比性能更重要。

既然你标记了,我可以建议你以下方法。

Map<Object, Double> scoreMap = Arrays.stream(scores)
        .collect(
            Collectors.groupingBy(i -> i[0], 
            Collectors.averagingInt(i -> Integer.parseInt(i[1])
        )));

String winner = scoreMap.entrySet().stream()
    .max(Comparator.comparingDouble(e -> e.getValue()))
    .get().getKey().toString();

感谢@AndyTurner 提供.max(..) 参数建议。

【讨论】:

  • .max(Comparator.comparingDouble(e -&gt; e.getValue()).
  • @AndyTurner:谢谢你的留言 :))
【解决方案2】:

为了降低时间复杂度,你可以使用特定的集合:

public static String findMaxScore(String[][] scores) {
    final class Candidate implements Comparable<Candidate> {

        private final String name;
        private int scoreSum;
        private int attempts;

        public Candidate(String name) {
            this.name = name;
        }

        public void score(int score) {
            scoreSum += score;
            attempts++;
        }

        public double avg() {
            return (double)scoreSum / attempts;
        }

        @Override
        public int compareTo(Candidate candidate) {
            return Double.compare(candidate.avg(), avg());
        }
    }

    Map<String, Candidate> map = new HashMap<>();

    for (String[] data : scores) {
        map.putIfAbsent(data[0], new Candidate(data[0]));
        map.get(data[0]).score(Integer.parseInt(data[1]));
    }

    return new TreeSet<>(map.values()).iterator().next().name;
}

【讨论】:

  • 创建一个类来存储和比较候选人的详细信息,比像其他答案中建议的那样直接使用 java 流处理数据更有效?
  • @SatishK 是的。这就是例子。类可以在方法之外定义。
【解决方案3】:
public String  findmaxAverage(String[][] Grades) {
    if ( grades == null ) return "";
    Map<String,List<Integer>> map = new HashMap<>();
    for( String[] grade : Grades ) {
        List<Integer> mapList = map.get(grade[0]);
        if ( mapList == null ) mapList = new ArrayList<>();
        mapList.add(Integer.valueOf(grade[1]));
        map.put(grade[0], mapList);
    }

    double maxAverage = Double.MIN_VALUE;
    String winner = "";
    for( String name : map.nameSet()) {
        System.out.println(name+": "+map.get(name));
        List<Integer> mapList = map.get(name);
        double average = getAverage(mapList);
        if ( average > maxAverage) {
            maxAverage = average;
            winner = name;
        }

    }
    return winner; }

【讨论】:

    【解决方案4】:

    另外,通过这种方式,您可以通过Streams Api 执行相同的操作,

    import java.util.stream.*;
    import java.util.*;
    public class Solution {
      public static void main (String[] args) {
        String scores[][] = {{"Bob","80"},{"Charles","85"},{"Rob","70"},{"Bob","100"},{"Charles","75"}};
        
    
     Map<Object,Double> collectValues = Arrays.stream(scores).collect(Collectors.groupingBy(a->a[0],Collectors.averagingInt(a->Integer.parseInt(a[1]))));
    
        Map.Entry<Object,Double> MaxMarks = collectValues.entrySet().stream().max((e1,e2)->Double.compare(e1.getValue(), e2.getValue())).get();
    
        System.out.println(MaxMarks.getKey() + " :: " + MaxMarks.getValue());
    
    }
    

    【讨论】:

      猜你喜欢
      • 2017-06-30
      • 1970-01-01
      • 1970-01-01
      • 2018-09-04
      • 2014-06-11
      • 1970-01-01
      • 1970-01-01
      • 2021-01-15
      • 1970-01-01
      相关资源
      最近更新 更多