JS算法-只出现一次的数字

169 阅读2分钟

题目

给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

输入: nums = [2,2,1]
输出: 1

题目解析

第一种

定义函数 singleNumber,并接收一个参数 nums,代表一个整数类型的数组。创建一个空的Map数据结构 map。使用for循环遍历数组 nums 中的每一个元素。对于每个数组元素,做以下判断:如果 map 中已经存在当前元素,则将该元素对应的value加1。如果 map 中不存在当前元素,则将该元素添加到 map 中,并将它的value设置为1。使用for..of循环遍历 map 中的所有条目。对于每个条目,判断它的value是否等于1。如果条目的value等于1,则返回该条目的key作为结果,即找到了只出现一次的数字

var singleNumber = function(nums) {
    let map = new Map()
    for (let i=0; i<nums.length; i++) {
       if (map.has(nums[i])) {
            map.set(nums[i], map.get(nums[i])+1)
        } else {
            map.set(nums[i], 1)
        } 
    }
    for (let item of map.entires()) {
        if (item[1] == 1) {
         	return item[0]   
         }
    }
};

第二种

首先需要对数组进行排序,这样相同的元素就都在一起了。定义三个变量:cur表示当前遍历到的数,index表示当前遍历到的元素的下标,cnt表示当前遍历到的数出现的次数。使用循环遍历整个排序后的数组。循环的条件是index小于数组的长度。判断cur和nums[index]是否相等。如果相等,说明当前遍历到的数已经出现过了,所以计数器cnt加1,同时将index指向下一个元素。如果cur和nums[index]不相等,说明当前遍历到了一个新数。那么就需要判断之前遍历到的数cur的出现次数是否是1。如果是1,说明cur就是只出现1次的数,直接返回即可。如果cur的出现次数不是1,说明需要继续找,要重新设定cur的值、cnt的值,继续循环。最后,如果遍历完整个数组,最后一个数仍然出现次数大于1,那么这个数就是要找的只出现1次的数,返回cur即可

var singleNumber = function(nums) {
    nums.sort((a,b)=>a-b)
    let cur = nums[0],index = 1,cnt = 1
    while(index < nums.length){
        if(cur == nums[index]){
            cnt++
            index++
        }else{
            if(cnt <= 1){
                return cur
            }else{
                cur = nums[index]
                cnt = 1
                index++
            }
        }
    }
    return cur
};

坚持努力,无惧未来!