有趣的数字
到了小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 }
總結
- 上一篇: org.apache.maven.plu
- 下一篇: cannot find symbol [