有趣的数字
到了小Q喪心病狂的衛(wèi)生間思考時(shí)間:
題目:小Q今天在上廁所時(shí)想到了這個(gè)問題:有n個(gè)數(shù),兩兩組成二元組,相差最小的有多少對(duì)呢?相差最大呢?
輸入描述:
輸入包含多組測(cè)試數(shù)據(jù)。
對(duì)于每組測(cè)試數(shù)據(jù):
N - 本組測(cè)試數(shù)據(jù)有n個(gè)數(shù)
a1,a2...an - 需要計(jì)算的數(shù)據(jù)
保證:
1<=N<=100000,0<=ai<=INT_MAX.
輸出描述:
對(duì)于每組數(shù)據(jù),輸出兩個(gè)數(shù),第一個(gè)數(shù)表示差最小的對(duì)數(shù),第二個(gè)數(shù)表示差最大的對(duì)數(shù)。
示例1
輸入
6 45 12 45 32 5 6
輸出
1 2
思路:1.首先進(jìn)行數(shù)字排序,若最大值等于最小值,則最大對(duì)數(shù)=最小對(duì)數(shù)=n*(n-1)/2
2.用map統(tǒng)計(jì)數(shù)組中每種數(shù)字的個(gè)數(shù)
3.計(jì)算差最小的個(gè)數(shù)
如果數(shù)組中沒有重復(fù)數(shù)字,說明最小差不為0,最小差肯定是數(shù)組中相鄰兩個(gè)數(shù)的差,因此遍歷數(shù)組,統(tǒng)計(jì)最小差。
如果數(shù)組中有重復(fù)數(shù)字,說明最小差為0,最小差肯定是數(shù)組中相鄰兩個(gè)數(shù)的差,因此,遍歷一遍數(shù)組,并統(tǒng)計(jì)最小差。
4.計(jì)算差最大的個(gè)數(shù)
只有一種情況,即最大值和最小值的兩兩組合,故為最大值個(gè)數(shù)*最小值個(gè)數(shù)
目前搜集到的一個(gè)代碼:
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 //如果數(shù)組中的值全相同,直接兩兩組合
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用來統(tǒng)計(jì)
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 //求差最小個(gè)數(shù)
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 //求差最大個(gè)數(shù)
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 }
總結(jié)
- 上一篇: org.apache.maven.plu
- 下一篇: 美国gfs数据介绍和解析