Skip to content

136. 只出现一次的数字

js
;(function () {
  /**
   * 136. 只出现一次的数字
   * 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
   *
   * 说明:
   * 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
   *
   * 输入: [2,2,1]
   * 输出: 1
   *
   * 输入: [4,1,2,1,2]
   * 输出: 4
   *
   */

  function singleNumber(nums: number[]): number {
    // 方法一: 遍历数组 -- 两次循环,效率不高
    // type objType = {
    //     [prop: string]: number
    // }
    // let obj: objType = {};
    // let rtn: number = 0;
    // nums.forEach((item, index) => {
    //     obj[item + ''] === undefined ? obj[item + ''] = 1 : obj[item + '']++
    // })
    // for(let k in obj) {
    //     if (obj[k] === 1) {
    //         rtn = +k
    //         break
    //     }
    // }
    // return rtn

    // 方法二:效率也不是很高
    // 数组先排序,然后遍历数组(单个元素如果和前后都不相等,则判定当前元素唯一)
    // let newNums = nums.sort((a, b) => a - b)
    // let rtn = 0;
    // for(let k = 0; k < newNums.length; k++) {
    //     if (newNums[k] !== newNums[k + 1] && newNums[k] !== newNums[k - 1]) {
    //         rtn = newNums[k]
    //         break;
    //     }
    // }
    // return rtn

    // 方法三:异或(位运算)(官网提供)
    // 不需要额外空间的方法,就往位运算上想
    let single = 0
    for (let i in nums) {
      single ^= nums[i]
    }
    return single

    // 方法四: 哈希?
  }

  let arr = [2, 2, 1]
  let arr2 = [4, 1, 2, 2, 1]
  console.log(singleNumber(arr))
  console.log(singleNumber(arr2))
})()