算法(TS):只出现一次的数字

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

你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。

上题要求时间复杂度为 O(n),空间复杂度为O(1)

解法一:维护一个 Set 对象

创建一个空的 Set 对象,遍历数组 nums,每遍历出一个 num,便在 Set 对象中查找是否存在它,不存在则加入,存在则删除,等数组遍历结束,Set 对象中剩下的就是只出现一次的数字。

ts 复制代码
function singleNumber(nums: number[]): number {
  const uniqueSet = new Set<number>()
  for (const num of nums) {
    if (uniqueSet.has(num)) {
      uniqueSet.delete(num)
    } else {
      uniqueSet.add(num)
    }
  }

  return [...uniqueSet][0]
}

存在一次遍历数组,因此时间复杂度为 O(n),uniqueSet.size的最大值为 n/2,最小为 1, 空间复杂度为O(n)

解法二:位运算符(异或)

异或运算符有下面 3 个特性

  1. a ^ 0 = a,即,任何数与数字 0 异或,得到的结果都等于它本身
  2. a ^ a = 0,即,任何数与自身异或,得到的结果都等于 0
  3. a ^ b ^ c = a ^ c ^ b,异或运算符,满足交换率

遍历 nums,让数组中的数字两两异或,最终得到的结果便是数组中只出现一次的数字

ts 复制代码
function singleNumber(nums: number[]): number {
  let uniqueNumber = 0

  for (const num of nums) {
    uniqueNumber ^= num
  }

  return uniqueNumber
}

存在一次遍历数组,因此时间复杂度为 O(n),没有额外的中间量空间复杂度为O(1)

相关推荐
冰心孤城2 分钟前
Excel: xls与xlsx格式转换排坑指南
java·前端·excel
程序员黑豆22 分钟前
鸿蒙应用开发之跨组件传参:@Provide 与 @Consume 跨层级数据同步详解
前端·harmonyos
theoweb31 小时前
Typescript关于sort需要注意的地方
typescript
冻柠檬飞冰走茶1 小时前
PTA基础编程题目集 7-27 冒泡法排序(C语言实现)
c语言·开发语言·数据结构·算法
C++、Java和Python的菜鸟2 小时前
第9章 后端Web进阶(AOP)
java·开发语言·前端
我星期八休息2 小时前
扩展— TCP 全连接队列与 tcpdump 抓包
linux·服务器·开发语言·前端·网络·tcp/ip·tcpdump
大鱼>3 小时前
因子挖掘+回测+RL交易:量化金融完整系统
人工智能·深度学习·算法·金融
AC赳赳老秦3 小时前
CSDN 技术社区数据采集:OpenClaw 抓取公开技术热帖,生成领域技术热点周报
java·大数据·前端·数据库·python·php·openclaw
结网的兔子3 小时前
【前端开发】Web端迁移至 uni-app 及鸿蒙扩展方案对比
前端·uni-app·harmonyos
黄泉路醉s3 小时前
在Vant+Vue+TypeScript的H移动前端使用UnoCSS
前端·vue.js·typescript