1. 首页

LeetCode 137. 只出现一次的数字 II

题目描述

难度:Middle

相关话题:位运算

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

说明:

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

示例 1:

输入: [2,2,3,2]
输出: 3

示例2:

输入: [0,1,0,1,0,1,99]
输出: 99

思路:

对于时间O(n),空间O(1)的算法,需要编写一个状态机,当一个数出现3次,会抵消。

如果单变量使用^,只能抵消偶数次数,如果要3次抵消,必须要有2个变量同时^

a=a^nums[i]

b=b^nums[i]

但仅仅这样两个变量完全一致,无法3次抵消。

因此还需要使用~~的作用是将0变为11变为0,同时也可以将当前状态逆转。

a=(a^nums[i]) ~ b

b=(b^nums[i]) ~ a

例如一个数组[2,2,2,2,2,2],它每次的ab输出值为2,00,20,02,00,20,0,每3次置零。

/**
 * @ Javascript中文网 - 前端进阶资源教程 https://www.javascriptc.com/
 * @param {number[]} nums
 * @return {number}
 */
var singleNumber = function(nums) {
  let a=0,b=0
  for(let n of nums){
    a=(a^n) & ~b
    b=(b^n) & ~a
  }
  return a
};

看完两件小事

如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:

  1. 关注我们的 GitHub 博客,让我们成为长期关系
  2. 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
  3. 关注公众号 「画漫画的程序员」,公众号后台回复「资源」 免费领取我精心整理的前端进阶资源教程

JS中文网是中国领先的新一代开发者社区和专业的技术媒体,一个帮助开发者成长的社区,目前已经覆盖和服务了超过 300 万开发者,你每天都可以在这里找到技术世界的头条内容。欢迎热爱技术的你一起加入交流与学习,JS中文网的使命是帮助开发者用代码改变世界

本文著作权归作者所有,如若转载,请注明出处

转载请注明:文章转载自「 Js中文网 · 前端进阶资源教程 」https://www.javascriptc.com

标题:LeetCode 137. 只出现一次的数字 II

链接:https://www.javascriptc.com/4501.html

« LeetCode 138. 复制带随机指针的链表
手摸手带你一分钟就会玩 Git»
Flutter 中文教程资源

相关推荐

QR code