码迷,mamicode.com
首页 > 其他好文 > 详细

有趣的数字

时间:2019-04-22 22:44:29      阅读:385      评论:0      收藏:0      [点我收藏+]

标签:tin   ext   测试数据   不为   计算   有趣   string   ati   can   

到了小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 }

 

 

有趣的数字

标签:tin   ext   测试数据   不为   计算   有趣   string   ati   can   

原文地址:https://www.cnblogs.com/10081-AA/p/10753292.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!