刷题的日常-数组能形成多少数对

103 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 14 天,点击查看活动详情

刷题的日常-2023年2月16号

一天一题,保持脑子清爽

数组能形成多少数对

来自leetcode的 2341 题,题意如下:

给你一个下标从 0 开始的整数数组 nums 。在一步操作中,你可以执行以下步骤:

  • 从 nums 选出 两个 相等的 整数
  • 从 nums 中移除这两个整数,形成一个 数对

请你在 nums 上多次执行此操作直到无法继续执行。

返回一个下标从 0 开始、长度为 2 的整数数组 answer 作为答案,其中 answer[0] 是形成的数对数目,answer[1] 是对 nums 尽可能执行上述操作后剩下的整数数目。

理解题意

通过题意,我们可以将信息整理如下:

  • 题目给出一个数组,该数组是由数值构成的
  • 要求我们对数组进行统计,相同的数可以构成一对
  • 返回能构成的对数,以及落单的数值的个数

注意

数组里每个数的取值都在 0 到 100 之间

做题思路

题目很简单,其实就是统计相同数的成对数量而已。我们可以用Map记录出现的数以及它们出现的数量的映射关系,题目给出提示,出现的数只会在 0 到 100 之间,那么我们可以开辟一个大小为 101 的数组作为映射关系表,索引是数值本身,内容为出现的数量即可。步骤如下:

  • 开辟一个数组作为映射关系
  • 循环给定的数组
    • 如果当前出现的值的次数成对出现,则加一
    • 将出现的次数取摸
  • 最后还需要统计map中剩余的个数
  • 返回结果

代码实现

代码实现如下:

public class Solution {
    public int[] numberOfPairs(int... nums) {
        int[] map = new int[101], res = new int[]{0, 0};
        for (int num : nums) {
            res[0] += ++map[num] / 2;
            map[num] %= 2;
        }
        for (int num : map) {
            res[1] += num;
        }
        return res;
    }
}

image.png