• 有趣的数字


    到了小Q丧心病狂的卫生间思考时间:

    题目:小Q今天在上厕所时想到了这个问题:有n个数,两两组成二元组,相差最小的有多少对呢?相差最大呢?

    输入描述:

    输入包含多组测试数据。
    对于每组测试数据:
    N - 本组测试数据有n个数
    a1,a2...an - 需要计算的数据
    保证:
    1<=N<=100000,0<=ai<=INT_MAX.

    输出描述:

    对于每组数据,输出两个数,第一个数表示差最小的对数,第二个数表示差最大的对数。

    示例1

    输入

    6
    45 12 45 32 5 6
    

    输出

    1 2
    思路:1.首先进行数字排序,若最大值等于最小值,则最大对数=最小对数=n*(n-1)/2
    2.用map统计数组中每种数字的个数
    3.计算差最小的个数
    如果数组中没有重复数字,说明最小差不为0,最小差肯定是数组中相邻两个数的差,因此遍历数组,统计最小差。
    如果数组中有重复数字,说明最小差为0,最小差肯定是数组中相邻两个数的差,因此,遍历一遍数组,并统计最小差。
    4.计算差最大的个数
    只有一种情况,即最大值和最小值的两两组合,故为最大值个数*最小值个数
    目前搜集到的一个代码:
     1 import java.util.ArrayList;
     2 import java.util.Arrays;
     3 import java.util.List;
     4 import java.util.Map;
     5 import java.util.Scanner;
     6 import java.util.TreeMap;
     7  
     8 public class Main {
     9  
    10     public static void main(String[] args) {
    11         Scanner sc = new Scanner(System.in);
    12         while(sc.hasNext()){
    13             int n = sc.nextInt();
    14             int[] a = new int[n];
    15             for(int i=0;i<n;i++){
    16                 a[i] = sc.nextInt();
    17             }
    18              
    19             Arrays.sort(a);
    20             //如果数组中的值全相同,直接两两组合
    21             if(a[0] == a[n-1]){
    22                 int tmp = (n*(n-1))/2;
    23                 System.out.println(tmp + " " + tmp);
    24                 continue;
    25             }
    26             //map用来统计
    27             Map<Integer, Integer> map = new TreeMap<Integer, Integer>();
    28             for(int i=0;i<n;i++){
    29                 if(map.containsKey(a[i]))
    30                     map.put(a[i], map.get(a[i])+1);
    31                 else
    32                     map.put(a[i], 1);
    33             }
    34             //求差最小个数
    35             int minres = 0;
    36             if(map.size() == n){
    37                 int min = Math.abs(a[1]-a[0]);
    38                 for(int i=1;i<n;i++){
    39                     int tmp = Math.abs(a[i]-a[i-1]);
    40                     if(tmp == min)
    41                         minres++;
    42                     else if(tmp < min){
    43                         min = tmp;
    44                         minres = 1;
    45                     }
    46                 }
    47             }else{
    48                 for(Integer key : map.keySet()){
    49                     int val = map.get(key);
    50                     if(val > 1){
    51                         minres += (val * (val-1))/2;
    52                     }
    53                 }
    54             }
    55             //求差最大个数
    56             int maxres = 0;
    57             List<Integer> keyset = new ArrayList<Integer>(map.keySet());
    58             int val1 = map.get(keyset.get(0));
    59             int val2 = map.get(keyset.get(keyset.size()-1));
    60             maxres = val1 * val2;
    61             System.out.println(minres + " " + maxres);         
    62         }
    63     }
    64  
    65 }
     
  • 相关阅读:
    如何解决移动端滚动穿透问题
    如何在mac中通过命令行使用sublime
    正向代理和反向代理
    UTF8、UTF16、UTF16-LE、UTF16-BE、UTF32都是些什么?
    依赖的版本
    如何移除inline-block元素之间的空白
    如何用JavaScript重定向到另一个网页?
    [读书笔记] 高性能网站建设指南
    java使用jconsole查看java程序运行(jmx原理)
    oracle相关知识点
  • 原文地址:https://www.cnblogs.com/10081-AA/p/10753292.html
Copyright © 2020-2023  润新知