算法题解-只出现一次的数字3

87 阅读2分钟

题目

给你一个整数数组 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;
};

坚持努力,无惧未来!