持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第23天,点击查看活动详情
前言
继续来两道简单的数组统计的题目,数组类型的题目还是挺多的,题型也比较多。
442题目描述
给你一个长度为 n 的整数数组 nums ,其中 nums 的所有整数都在范围 [1, n] 内,且每个整数出现 一次 或 两次 。请你找出所有出现 两次 的整数,并以数组形式返回。
你必须设计并实现一个时间复杂度为 O(n) 且仅使用常量额外空间的算法解决此问题。
示例 1:
输入:nums = [4,3,2,7,8,2,3,1] 输出:[2,3] 示例 2:
输入:nums = [1,1,2] 输出:[1] 示例 3:
输入:nums = [1] 输出:[]
解题思路
这一题属于简单题目,其中需要注意的点如下:
- 首先要明确整数数组中项都在[1,n]中,那么我们就可以循环这个1-n的数组
- 在循环过程中用map来做记录,其中map的键为当前项的值,如果map中不存在这个键那就存入,也就是map.set(nums[i],1)
- 如果map中已经存在了当前项的键,那么说明当前项就是重复的,push进结果数组即可
代码如下:
/**
* @param {number[]} nums
* @return {number[]}
*/
var findDuplicates = function(nums) {
var map = new Map()
let result = []
for(let i=0;i<nums.length;i++){
if(map.get(nums[i])){
result.push(nums[i])
}else{
map.set(nums[i],1)
}
}
return result
};
运行结果如下图:
448题目描述
给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果。
示例 1:
输入:nums = [4,3,2,7,8,2,3,1] 输出:[5,6] 示例 2:
输入:nums = [1,1] 输出:[2]
解题思路
这题和上题的区别是上题是统计重复的数字,这题是统计确实的数字,注意的点有以下几点
- 这里题目中的n就是数组的长度
- 我们可以直接以[1-n]这个数组来循环,同时判断nums[i]中是否存在当前项(通过indexOf) 代码如下:
/**
* @param {number[]} nums
* @return {number[]}
*/
var findDisappearedNumbers = function(nums) {
let count = nums.length
let result = []
for(let i=1;i<=count;i++){
if(nums.indexOf(i)===-1){
result.push(i)
}
}
return result
};
这道题目中用了indexOf,也可以不用,直接用当前数组当做一个哈希表也可以实现题目的要求
总结
对数组的处理在日常的工作中是很常见的,一定掌握对数组的各种操作,继续加油,gogogo