136. 只出现一次的数字|刷题打卡

155 阅读3分钟

136. 只出现一次的数字|刷题打卡

create by db on 2021-3-2 22:48:10
Recently revised in 2021-3-2 23:38:36

闲时要有吃紧的心思,忙时要有悠闲的趣味

原题链接136. 只出现一次的数字

目录

题目描述

返回目录

 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

说明:

 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:

输入: [2,2,1]
输出: 1
示例 2:

输入: [4,1,2,1,2]
输出: 4
通过次数342,567提交次数482,674

思路分析

 因为题目要求我们的算法应该具有线性时间复杂度,不使用额外空间,也就是不能使用辅助数组来做。

 其中有一句调教很重要——除了某个元素只出现一次以外,其余每个元素均出现两次!

思路一:

 这就让我想到了位运算——异或(^)。

tips: 按位“异或”运算符说明

^ 运算符查看两个表达式的二进制表示法的值,并执行按位异或。该操作的结果如下所示:

0101 (expression1)
1100 (expression2)
----
1001 (结果)

 当且仅当只有一个表达式的某位上为 1 时,结果的该位才为 1。否则结果的该位为 0。即两个相等的数相加为0。

思路二:

 虽然不能使用辅助数组,但是我们可以一个数组正反两头查啊。

 出现两次的元素肯定不在同一位置,出现一次的别管哪头查都在同一位置。找出他来就好了。

AC 代码

题解一:异或运算

/**
 * @param {number[]} nums
 * @return {number}
 */
var singleNumber = function(nums) {
    let res = 0
    nums.forEach(el=> {
      res ^= el
    })
    return res
};

题解二:正反查找

/**
 * @param {number[]} nums
 * @return {number}
 */
var singleNumber = function(nums) {
    let res = 0
    nums.forEach(el=> {
      if(nums.indexOf(el) === nums.lastIndexOf(el)){
        res =  el
      }
    })
    return res
};

总结

返回目录

 很简单的一道题,柿子先挑软的捏……

 三月你好,春暖花开。加油!

 本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情

后记:Hello 小伙伴们,如果觉得本文还不错,记得点个赞或者给个 star,你们的赞和 star 是我编写更多更丰富文章的动力!GitHub 地址

文档协议

知识共享许可协议
db 的文档库db 采用 知识共享 署名-非商业性使用-相同方式共享 4.0 国际 许可协议进行许可。
基于github.com/danygitgit上的作品创作。
本许可协议授权之外的使用权限可以从 creativecommons.org/licenses/by… 处获得。