跳至主要內容

数组中重复的数字

微信公众号:储凡2023/2/23大约 2 分钟

数组中重复的数字

题目链接

题目描述

在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组[2,3,1,0,2,5,3],那么对应的输出是2或者3。存在不合法的输入的话输出-1

数据范围:0≤n≤10000

进阶:时间复杂度O(n) ,空间复杂度 O(n)

刷题思路

代码实现

/**
 * 方案一:将所有数据排序(升序或者降序都行),如果存在左右相等的情况就是重复了,输出一个即可;
 * 存在问题:时间复杂度依赖sort()函数
 */
function duplicateOne(numbers) {
  // 升序
  numbers = numbers.sort((a, b) => a - b)
  // 降序
  // numbers = numbers.sort((a, b) => b - a)

  for (let index = 0; index < numbers.length - 1; index++) {
    if (numbers[index] === numbers[index + 1]) {
      // 存在两个元素重复
      return numbers[index]
    }
  }
  return -1
}

/**
 * 方案二:借助空数组,循环遍历目标数组按照index的值放入 如果存在则重复
 */
function duplicateTwo(numbers) {
  const arr = []
  for (let i = 0; i < numbers.length; i++) {
    // 这部分依赖的是排序后,如果不重复理想情况下:numbers[index]===index的情况
    if (!arr[numbers[i]]) {
      arr[numbers[i]] = 1
    }
    else {
      // 存在则重复
      return numbers[i]
    }
  }
  return -1
}

/**
 * 方案三: 利用Set集合值唯一的特性
 */
function duplicateThree(numbers) {
  const set = new Set()
  for (const number of numbers) {
    if (set.has(number)) {
      return number
    }
    set.add(number)
  }
  return -1
}

console.log(duplicateOne([2, 3, 1, 0, 2, 5, 3]))
console.log(duplicateTwo([2, 3, 1, 0, 2, 5, 3]))
console.log(duplicateThree([2, 3, 1, 0, 2, 5, 3]))

一些建议

更新日志

2024/7/29 15:43
查看所有更新日志
  • 5a2b2-feat: 移除markdown-cli模块,采用prettier校验文档格式
  • c0f2d-refactor: 升级vuepress相关版本,优化项目结构 (#137)
  • 6ff0a-feat(algo): 新增剑指、shell等算法文档
  • 06596-feat: 算法相关文档新增固定链接,优化导入代码配置
  • 9b9e4-feat: 算法相关文档更新,删除讨论链接 (#88)
  • b0275-feat(markdownlint-cli): 添加markdown文档校验,支持lint脚本自动格式化文档
  • 5f1e1-feat: 导航栏、侧边栏内容修改,新增目录对应的文档
  • 02ab1-style: 文档目录调整,修改mdEnhance配置
  • d0347-docs(algorithm): 新增模版格式
  • fc602-feat: 新增算法文档
  • ced18-docs: 更新一些文档,优化导航栏
  • a23ce-refactor: 新增manuscript目录,优化文稿结构
  • 74aa9-docs(algorithm): 新增一些文档