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