題目描述

華生給了夏洛克‧福爾摩斯一個包含N個整數的陣列A0, A1 ... AN-1,然後華生問夏洛克存在多少組數對(i, j),其索引值並不相同,但元素值是相同的。即i ≠ j,但 Ai = Aj



原題網址

https://www.hackerrank.com/challenges/sherlock-and-pairs/

輸入格式

輸入第一行為一個整數T,表示接下來有多少組測試的資料要輸入,範圍在1到10之間(包含1和10)。

接下來輸入的每組測試數據中,第一行皆為一個整數N,表示陣列的長度,範圍在1到105之間(包含1和105)。第二行皆為N個用空格分隔的整數,範圍在1到106之間(包含1和106)。

輸出格式

獨立輸出每組測試資料的結果到新的一行。

範例輸入

2
3
1 2 3
3
1 1 2

範例輸出

0
2

額外解釋

第一組測試資料,找不到符合條件的數對。

第二組測試資料A[0] = A[1] = 1,所以共有(0,1)和(1,0)兩個數對。

解題概念

輸入測試資料的時候,由於陣列元素的數值範圍並不算太大,可以輕易地使用陣列來儲存出現的次數。也就是說,在輸入完測試資料的時候,只要再找出出現過兩次以上的元素進行排列組合計算即可。

參考答案

import java.util.*;

public class Solution {

    public static void main(final String[] args) {
        final Scanner sc = new Scanner(System.in);

        int t = sc.nextInt();
        while (t-- > 0) {
            final int n = sc.nextInt();

            final int[] counts = new int[1000000];

            for (int i = 0; i < n; ++i) {
                ++counts[sc.nextInt() - 1];
            }

            long counter = 0;
            for (int i = 0; i < 1000000; ++i) {
                final long count = counts[i];
                if (count > 1) {
                    counter += count * (count - 1);
                }
            }
            System.out.println(counter);
        }
    }
}