开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第24天,点击查看活动详情
题目描述
给你一个下标从 0 开始的整数数组 nums 。在一步操作中,你可以执行以下步骤:
从 nums 选出 两个 相等的 整数
从 nums 中移除这两个整数,形成一个 数对
请你在 nums 上多次执行此操作直到无法继续执行。
返回一个下标从 0 开始、长度为 2 的整数数组 answer 作为答案,其中 answer[0] 是形成的数对数目,answer[1] 是对 nums 尽可能执行上述操作后剩下的整数数目。
来源:力扣(LeetCode)
- 示例 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 个数字。
- 示例 1
输入:nums = [0]
输出:[0,1]
解释:无法形成数对,nums 中剩下 1 个数字
提示:
1 <= nums.length <= 1000 <= nums[i] <= 100
思路分析
根据题意可知,题目给出一个整数数组nums,需要我们取出其中两个相同的数字;只要有两个相同的数字就需要一直循环把它们取出来,直到里面的数字都是不相同。算出删除的次数和剩下数组的长度。
声明一个变量count存储删除的次数;开始循环数组nums,拿当前循环项在数组找出和它相同数字的下标index,若是有值,就删除当前循环项和它相同的数,由于前面已经删除了一个,i要相应的减一。次数count就加一。直到循环结束,返回[count, arr.length]。
AC代码
function solution(arr) {
let count = 0;
for(let i=0; i<arr.length; i++) {
let index = arr.indexOf(arr[i], i+1);
if(index != -1) {
arr.splice(i, 1);
arr.splice(index - 1, 1);
i--;
count ++;
}
}
console.log([count, arr.length])
}
let nums = [1,3,2,1,3,2,2];
solution(nums);