题目
给你一个整数数组
nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。
输入: nums = [1,2,1,3,2,5]
输出: [3,5]
题解
第一种
我们在函数中接受一个参数nums,它表示一个整数数组,然后我们声明一个res空数组用于存储我们统计的数据,然后我们接下来使用sort方法对nums数组进行排序,接下来使用一个循环来进行遍历整个nums数组,在循环中我们先判断res数组中的元素个数是否已经为2,如果是我们则跳出循环,在继续判断当前元素和下一个元素是否相等,相等则说明这两个元素都不是只出现一次的数字,我们则直接跳过这两个元素,不相等则说明当前元素是只出现一次的数字,我们将其添加到res数组中,并将遍历的指针i加1,最后我们将res数组返回出去即可
var singleNumber = function(nums) {
let res = []
nums.sort((a,b)=>a-b)
for(let i=0;i<nums.length;){
if(res.length === 2){
break
}
if(nums[i] === nums[i+1]){
i+=2
}else{
res.push(nums[i])
i++
}
}
return res
};
第二种
我们在函数中先声明了ret变量它是一个空数组,接着声明了obj变量它是一个空对象,这两个变量主要用于存储结果和统计数字出现的次数,然后我们使用循环遍历整个数组nums,循环条件为当前i变量小于len变量,len变量的值是nums参数的长度,所以这里也是当前i变量不小于nums的数据长度,我们在循环中对于每一个元素进行判断,如果它已经在obj对象中出现过,我们就将其出现次数加1,否则就将其初始出现次数设为1,然后我们使用对象上的keys方法结合数组上的forEach方法进行遍历obj对象的所有键,我们在循环中对于每一个键,如果对应的值为1,我们就将该键添加到ret数组中,最后我们将ret数组返回出去即可
var singleNumber = function(nums) {
let ret = [];
let obj = {};
for(let i = 0, len = nums.length; i < len; i++) {
if(nums[i] in obj) {
obj[nums[i]] = obj[nums[i]] + 1;
}else {
obj[nums[i]] = 1;
}
}
Object.keys(obj).forEach((val, idx) => {
if(obj[val] === 1) {
ret.push(val);
}
});
return ret;
};
坚持努力,无惧未来!