题目
给你一个 非空 整数数组 nums
,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。
输入: nums = [4,1,2,1,2] 输出: 4
思路一
首先我们先将nums数组使用sort方法由大到小排序,在定义num1变量,默认为0,用来存放只出现一次的数字,在使用for循环对nums数组进行遍历,如果num1变量与nums[i]项相等,则将nums[i]赋值给num1,如果num1变量与nums[i]项不相等,则说明数组中出现了一个新的元素,在进行比较nums[i]项和nums[i+1]项是否相等,如果相等则说明nums[i]出现了两次,如果不相等,则表明nums[i]只出现了一次,返回num1变量
var singleNumber = function(nums) { nums.sort((a,b)=>a-b); let num1 = 0; for(let i=0;i<nums.length;i++){ if(num1==nums[i]){ num1=nums[i]; }else if (nums[i]==nums[i+1]){ num1=nums[i+1]; } else{ num1 = nums[i]; return num1 } } };
思路二
我们先声明一个空数组arr,然后判断当前的nums数组长度是否等于1,如果等于1则直接将当前nums数组的第一项返回出去,如果不是则进行循环nums数组,在循环中使用indexOf方法判断循环的当前项是否在arr数组中,如果不存在则使用push方法追加到arr数组中,如果存在,则使用splice方法结合indexOf方法将当前项从arr数组中删除掉,最后将arr数组的第一项返回出去即可
var singleNumber = function (nums) { let arr = [] if (nums.length == 1) { return nums[0] } for (let i = 0; i < nums.length; i++) { if (arr.indexOf(nums[i]) == -1) { arr.push(nums[i]) } else { arr.splice(arr.indexOf(nums[i]), 1) } } return arr[0] };