开启掘金成长之旅!这是我参与「掘金日新计划 · 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;
}
}