leetCode 编号136和137

4 阅读1分钟

136. 只出现一次的数字:给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间

方法一
思路:
  1. 题中明说了只有一个没有重复的值,所以只要求出在数组中 第一次 出现的索引和 最后一次 出现索引相同的值即可
/**
 * @param {number[]} nums
 * @return {number}
 */
var singleNumber = function(nums) {
    let len = nums.length
    for(let i = 0; i < len; i++) {
        if(nums.lastIndexOf(nums[i]) == nums.indexOf(nums[i])) {
            return nums[i]
        }
    }
};
方法二( 推荐 官方题解
思路:
  1. 任何数和 0 做异或运算,结果仍然是原来的数,即 a⊕0=a。
  2. 任何数和其自身做异或运算,结果是 0,即 a⊕a=0。
  3. 异或运算满足交换律和结合律,即 a⊕b⊕a=b⊕a⊕a=b⊕(a⊕a)=b⊕0=b
/**
 * @param {number[]} nums
 * @return {number}
 */
var singleNumber = function(nums) {
    let result = 0
    for(let num of nums) {
        result ^= num
    }
    return result
};

137. 只出现一次的数字 II:给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。

思路:(同136直接复制就行)
/**
 * @param {number[]} nums
 * @return {number}
 */
var singleNumber = function(nums) {
    let len = nums.length
    for(let i = 0; i < len; i++) {
        if(nums.lastIndexOf(nums[i]) == nums.indexOf(nums[i])) {
            return nums[i]
        }
    }
};