开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 4 天,点击查看活动详情
题目 leetcode.cn/
- 给你一个下标从 0 开始的整数数组
nums。在一步操作中,你可以执行以下步骤:- 从
nums选出 两个 相等的 整数 - 从
nums中移除这两个整数,形成一个 数对
- 从
- 请你在
nums上多次执行此操作直到无法继续执行。 - 返回一个下标从 0 开始、长度为
2的整数数组answer作为答案,其中answer[0]是形成的数对数目,answer[1]是对nums尽可能执行上述操作后剩下的整数数目。
示例
-
示例 1:
- 输入: nums = [1,3,2,1,3,2,2]
- 输出: [3,1]
- 解释:
- nums[0] 和 nums[3] 形成一个数对,并从 nums 中移除,nums = [3,2,3,2,2] 。
- nums[0] 和 nums[2] 形成一个数对,并从 nums 中移除,nums = [2,2,2] 。
- nums[0] 和 nums[1] 形成一个数对,并从 nums 中移除,nums = [2] 。
- 无法形成更多数对。总共形成 3 个数对,nums 中剩下 1 个数字。
-
示例 2:
- 输入: nums = [1,1]
- 输出: [1,0]
- 解释: nums[0] 和 nums[1] 形成一个数对,并从 nums 中移除,nums = [] 。无法形成更多数对。总共形成 1 个数对,nums 中剩下 0 个数字。
-
示例 3:
- 输入: nums = [0]
- 输出: [0,1]
- 解释: 无法形成数对,nums 中剩下 1 个数字。
提示
代码
function numberOfPairs(nums: number[]): number[] {
nums.sort((a, b) => { return a- b; });
let sum = 0;
for(let i = 0; i < nums.length - 1; i++){
if(nums[i] === nums[i+1]){
sum++;
i++;
}
}
return [sum, nums.length - (sum * 2)];
};
-
排序 + 遍历统计:
- 数对是相同数字成对出现的,所以可以先使用
sort方法将数组排序,排序后的数组内每个相同的数字都会紧紧相邻在一起 - 然后遍历排序后的数组,依次判断前一项和后一项,如果相等,那么是一个数对,统计变量
+1,同时遍历参数也需要+1 - 最后返回的结果,数对的个数就是统计到的次数,剩余的个数就是数组总长度减去数对包含元素的个数(
一个数对包含两个元素,所以要* 2) - 这样就不用删除原数组的元素也能得到剩余的个数
- 数对是相同数字成对出现的,所以可以先使用
function numberOfPairs(nums: number[]): number[] {
let sum = 0;
for(let i = 0; i < nums.length - 1; i++){
for(let k = i+1; k < nums.length; k++){
if(nums[i] === nums[k]){
nums.splice(k, 1);
sum++;
break;
}
}
}
return [sum, nums.length - sum];
};
-
双重遍历 + 判断:
- 这里就不用先对原数组进行排序了,而是直接进行双重遍历操作,外层遍历依次取出数组内元素,内层遍历从外层元素后一个开始取出
- 如果两个元素相等,那么这里使用
splice方法删除内层遍历的相等的那个元素(这里只删除后面的相同的那个,不用两个都删除,如果都删除的话,遍历的下标不好维护),统计数对的变量+1,同时退出当前内循环。 - 最后返回的结果,数对的个数就是统计到的次数,剩余的个数就是删除元素后的数组长度(
splice改变原数组 长度)减去数对的个数(之前遍历的时候已经删除一个了,所以这里不用 * 2 了)
结果
-
排序 + 遍历统计:
-
双重遍历 + 判断: