剑指 Offer II 070. 排序数组中只出现一次的数字

140 阅读1分钟

剑指 Offer II 070. 排序数组中只出现一次的数字

给定一个只包含整数的有序数组 nums ,每个元素都会出现两次,唯有一个数只会出现一次,请找出这个唯一的数字。

示例 1:

输入: nums = [1,1,2,3,3,4,4,8,8]
输出: 2

示例 2:

输入: nums =  [3,3,7,7,10,11,11]
输出: 10

方法一

异或运算

var singleNonDuplicate = function(nums) {
    return nums.reduce((a, b) => a ^ b)
};

使用map结构

var singleNonDuplicate = function(nums) {
  const map = new Map()
  for (let item of nums) {
    if (map.has(item)) {
      map.set(item, map.get(item) + 1)
    } else {
      map.set(item, 1)
    }
  }
  let result = 0
  map.forEach((value, key) => {
    if (value == 1) {
      result = key
    }
  })
  return result
};

二分查找

var singleNonDuplicate = function (nums) {
    var left = 0;
    var right = nums.length - 1;
    while (left <= right) {
        var t = (right - left) / 2;
        var mid = t + left;
        if (nums[mid] !== nums[mid - 1] && nums[mid] !== nums[mid + 1]) {
            return nums[mid];
        }
        if (nums[mid] == nums[mid - 1]) {
            if ((t + 1) % 2 == 0) {
                left = mid + 1;
            } else {
                right = mid - 2;
            }
        } else {
            if ((t + 1) % 2 == 0) {
                right = mid - 1;
            } else {
                left = mid + 2;
            }
        }
    }
    return nums[left];
};