给你一个整数数组 nums 。
如果一组数字 (i,j) 满足 nums[i] == nums[j] 且 i < j ,就可以认为这是一组 好数对 。
返回好数对的数目。
有两种方法:
第一种是暴力法,从数组左边第一位挨个数,看有多少好数对;
第二种方法时公式法,利用组合公式,先计算出数组中每个元素出现了多少次,然后利用 A = ( n ( n − 1 ) 2 ) A = \left(\frac{n(n-1)}{2}\right) A=(2n(n−1))即可,其实好数对也就是一个集合中的组合数。
代码如下:
//导入BufferedReader、InputStreamReader IOException包
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.HashMap;
//类名
public class Main{
// 主函数,抛出异常
public static void main(String[] args) throws IOException{
// 定义读取器。
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入一串数字,以空格分割:");
// 得到string串,分割为字符数组
String[] strArr = bf.readLine().split(" ");
// 将字符串数组转为列表,转为流,利用int流的转换方法,利用lanmbda转换函数,转为数组
int[] intArr = Arrays.asList(strArr).stream().mapToInt(Integer::parseInt).toArray();
// 创建对象
Solution solution = new Solution();
// 定义结果,对象方法,得到结果
int result1 = solution.getGoodpair(intArr);
int result2 = solution.numIdenticalPairs(intArr);
// 打印函数结果
System.out.print("暴力法的计算结果为: ");
System.out.println(result1);
System.out.print("公式法的计算结果为: ");
System.out.println(result2);
}
}
// 定义类
class Solution {
/**
* 第一种是暴力法,从数组左边第一位挨个数,看有多少好数对;
*/
// 子函数名(数组)must static method
public static int getGoodpair(int[] arr){
// 定义计数器
int count = 0;
// 外循环,遍历数组, subscript equal arr num sub 1.
for (int i = 0; i < arr.length - 1; i++) {
// 内循环,比较当前数字和后面每一位数字, subscript equal arr num and from i + 1.
for (int j = i + 1; j < arr.length; j ++) {
// 如果数字相等,计数器加一
if (arr[i] == arr[j]) {
count++;
}
}
}
// 返回计数器
return count;
}
/**
*第二种思路就是利用数学中的排列思想,先统计出数组中每个元素出现的次数,
*然后对每个数字出现的次数用排列公式计算下,再求个和,这样只用遍历数组一次就可以了。
*
* 组合公式 sum = n(n-1)/2
*/
// 定义得到好数的方法(int 数组)
public int numIdenticalPairs(int[] nums) {
// 定义hashmap
HashMap<Integer, Integer> map = new HashMap<>();
// 遍历数组
for (int num : nums) {
// 得到map中key的次数,将其加一,然后放回map中
map.put(num, map.getOrDefault(num, 0) + 1); // map的key不能相同
}
// 定义求和结果
int result = 0;
// 利用entry遍历HashMap的entry set
for (HashMap.Entry<Integer, Integer> entry: map.entrySet()) {
// 定义临时变量v,保存entry中的value
int v = entry.getValue();
// 得到entry对应key的value,利用公式,计算组合数
// 把该组合数加到result中
result += (v * (v - 1) / 2);
}
// 返回结果
return result;
}
}