【剑指offer】1.数组中重复的数字(java)

news/2024/11/24 6:01:15/

数组中重复的数字

  • 描述
  • 示例1
  • 思路
  • 完整代码

描述

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

数据范围: 0 ≤ n ≤ 10000 0≤n≤10000 0n10000

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

示例1

输入:

[2,3,1,0,2,5,3]

返回值:

2

说明:

2或3都是对的    

思路

首先是如何检测数组中有重复变量,由于题目说只需找出有重复变量的即可,不需要这个变量的重复数量是最多的,这就省去了很多功夫。

  1. 第一种最容易想到的方法就是类似于冒泡排序的双重for循环,取出数组第一个元素,依次和后面每个相比,如果相等直接赋值给result,缺点就是双重for循环的时间复杂度比较高,当数组元素过多时耗时比较大

    loop:
    for (int i = 0; i < numbers.length; i++) {for (int j = i + 1; j < numbers.length; j++) {if (numbers[i] == numbers[j]) {result = numbers[i];break loop;}}
    }
    

    注意这里给第一个for循环起名loop,因为如果在第二个for循环里直接使用break结束的是里层的for循环,即找到了结果还需要继续剩下的循环过程。如果指定结束外层循环loop就可以使程序运行结果更快。

  2. 第二个想到的办法是使用Set,因为Set有个函数 contains(Object o) ,只需一次for循环依次将变量加到Set中,如果Set中已有这个元素则说明这个元素重复,则输出结果。

    Set<Integer> numberSet = new HashSet<>();
    for (int i = 0; i < numbers.length; i++) {if (numberSet.contains(numbers[i])) {result = numbers[i];break;} else {numberSet.add(numbers[i]);}
    }
    

然后判断不合法输入。题目说:所有数字都在0到n-1的范围内,因此比较笨的方法就是一个一个判断数组里面有没有不合理的数,有的话将结果赋值为1。

int result = numbers[0];
for (int i = 0; i < numbers.length; i++) {if (numbers[i] < 0 || numbers[i] >= numbers.length) {result = -1;}
}

但是后来有个样例没通过时发现当输出空数组时也算作不合理的输入,此时也应该输出-1,所以一开始就直接将结果赋值为-1

int result = -1;

一开始我觉得那个for循环判断可以省去,但是当输入的数组是下面这种情况时就会输出错误结果

numbers={1,5,5,2,3}

即重复的元素是不合理的输入数据,此时result结果应该为5,因为5是重复数据,但是5是不合理的数据,所以最后还是得加for循环来检测是否有不合理数据,有的话再将输出结果改为-1。

完整代码

由于线上编程只需要完成方法内完成的部分,即如下:

public int duplicate (int[] numbers) {// write code hereint result = -1;Set<Integer> numberSet = new HashSet<>();for (int i = 0; i < numbers.length; i++) {if (numberSet.contains(numbers[i])) {result = numbers[i];break;} else {numberSet.add(numbers[i]);}}for (int i = 0; i < numbers.length; i++) {if (numbers[i] < 0 || numbers[i] >= numbers.length) {result = -1;}}return result;}

没包括数据输入部分


http://www.ppmy.cn/news/877794.html

相关文章

HOT62-N皇后

leetcode原题链接&#xff1a;N皇后 题目描述 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返…

小白求助 该版本的 %1 与你运行的 Windows 版本不兼容。请查看计算机的系统信息,然后联系软件发布者怎么解决呀

为什么我win10新下的dev-c 运行时提示 该版本的 %1 与你运行的 Windows 版本不兼容。请查看计算机的系统信息&#xff0c;然后联系软件发布者 在线求助&#xff0c;救救孩子吧

计算机非核心期刊

非版面费多少&#xff1f; 根据一般杂志社版面费计算规则&#xff1a;省级期刊:400元-800元&#xff0c;国家级期刊一般在1500元左右。具体的版面费用还得来本网站核实&#xff0c;不同的撰写费用也会有所偏差所以大家可以咨询本文网站在线客服了解详细情况。 非核心期刊有哪…

win10教育版激活错误:在运行 Microsoft Windows 非核心版本的计算机上,运行slui.exe ...”...

折腾了一天&#xff0c;最终轻松解决&#xff0c;先启用Software Protection服务&#xff0c;在激活&#xff08;密钥或者工具都行&#xff09;。 PS:但是这样还是无法解决Software Protection自动停止的问题&#xff0c;这个可以参考网上的解决方案&#xff08;我是参考这个方…

Error0x803f7001,省时省力彻底解决win10多版本(以win10家庭中文版为例)升级为专业版并且永久激活问题

本人为win10 家庭中文版本,在网上搜寻了一堆升级密钥,后尝试多个密钥成功升级为专业版,但是使用其他博主所说的三行命令行语句方法总是在最后一步遇到错误0x803f7001:在运行 Microsoft Windows 非核心版本的计算机上. 运行疑难解答后提示:已经找到相关数字许可证,但是需要安装w…

非核心版本的计算机上_哪个版本的Microsoft Office最好使用、来占用最少的资源...

使用过多个版本的Microsoft Office和WPS Office。让我推荐几个版本&#xff1a; Microsoft Office 2003和Microsoft Office 2007是两个资源最密集的版本(不考虑旧版本的Office)&#xff0c;除非它们是特别旧的计算机&#xff0c;否则不建议安装。对于十年前的旧计算机&#xff…

Linux内核版本和发行版本

1.1.4 Linux的内核版本和发行版本 1&#xff0e;内核版本 内核是系统的心脏&#xff0c;是运行程序和管理像磁盘和打印机等硬件设备的核心程序&#xff0c;它提供了一个在裸设备与应用程序间的抽象层。例如&#xff0c;程序本身不需要了解用户的主板芯片集或磁盘控制器的细节就…

核心线程,非核心线程的区别你还记得吗?

/ 今日科技快讯 / 近日&#xff0c;腾讯发布了2020年第三季度业绩报告。财报显示&#xff0c;腾讯第三季度营收1254.5亿元&#xff0c;市场预估1238.29亿元&#xff0c;去年同期972.4亿元&#xff0c;同比增长29%。净利润385.4亿元&#xff0c;同比增长89%&#xff0c;市场…