剑指offer第二版-3.数组中重复的数
面试题3:数组中重复的数
题目要求:
在一个长度为n的数组中,所有数字的取值范围都在[0,n-1],但不知道有几个数字重复或重复几次,找出其中任意一个重复的数字。
解法比较:

/**
* Copyright(C) 2019 Hangzhou Differsoft Co., Ltd. All rights reserved.
*
*/
package com.java.offer; /**
* 一个长度为n的数组,值的范围在0~n-1内,有一个或多个数字重复,求其中任意一个
*
* @since 2019年1月29日 下午3:46:06
* @author xuchao
*
*/
public class P3_DuplicationInArray { // 方法一:暴力求解,不会修改原始数据,时间复杂度o(n^2),空间复杂度o(1)
public static int getDuplication1(int[] data) {
if (data == null || data.length < 2) {
return -1;
}
for (int i = 0; i < data.length - 1; i++) {
for (int j = i + 1; j < data.length; j++) {
if (data[j] == data[i]) {
return data[j];
}
}
}
return -1;
}
/**
* 方法二:排序(使用快排),会修改原始数据,时间复杂度o(nlogn),空间复杂度o(1)
* 1.使用内置排序(双轴快排),Arrays.sort(data)
* 2.自己手写快排
*/
public static int getDuplication2(int[] data) {
if (data == null || data.length < 2) {
return -1;
}
// 可以使用内置排序(双轴快排)
// Arrays.sort(data);
quickSort(data, 0, data.length - 1);
for (int i = 0; i < data.length - 1; i++) {
if (data[i + 1] == data[i]) {
return data[i + 1];
}
}
return -1;
} public static void quickSort(int[] data, int start, int end) {
if (start >= end) {
return;
}
int mid = partition(data, start, end);
quickSort(data, start, mid - 1);
quickSort(data, mid + 1, end);
} public static int partition(int[] data, int start, int end) {
int base = data[start];
int i=start,j=end;
while (i < j) {
while (i < j && data[j] >= base) {
j--;
}
while (i < j && data[i] <= base) {
i++;
}
if (i < j) {
int t = data[i];
data[i] = data[j];
data[j] = t;
}
}
data[start] = data[j];
data[j] = base;
return j;
} // 方法三:借助哈希表,不会修改原始数据,时间复杂度o(n),空间复杂度o(n)
public static int getDuplication3(int[] data) {
if (data == null || data.length < 2) {
return -1;
}
int[] a = new int[data.length];
for (int t : data) {
if (a[t] == 1) {
return t;
} else {
a[t] = 1;
}
}
return -1;
} // 方法四:根据数字特点排序,会修改原始数据,时间复杂度o(n),空间复杂度o(1)
public static int getDuplication4(int[] data) {
if (data == null || data.length < 2) {
return -1;
}
for (int i = 0; i < data.length; i++) {
while (data[i] != i) {
if (data[i] == data[data[i]]) {
return data[i];
} else {
int temp = data[i];
data[i] = data[temp];
data[temp] = temp;
}
}
}
return -1;
} public static void main(String[] args) {
int[] data1 = { 2, 5, 6, 4, 6, 3, 1 };
// 不修改原始数据
System.out.println(getDuplication1(data1));
System.out.println(getDuplication3(data1)); int[] data2 = { 2, 5, 6, 4, 6, 3, 1 };
System.out.println(getDuplication2(data2)); int[] data3 = { 4, 3, 5, 1, 5, 0 };
System.out.println(getDuplication4(data3));
}
}
剑指offer第二版-3.数组中重复的数的更多相关文章
- 【Java】 剑指offer(1) 找出数组中重复的数字
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 在一个长度为n的数组里的所有数字都在0到n-1的范围内.数组中某些数字 ...
- 【剑指Offer】50、数组中重复的数字
题目描述: 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果 ...
- 剑指offer(50)数组中重复的数字
题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为 ...
- 剑指offer五十之数组中重复的数字
一.题目 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为 ...
- 剑指Offer01之二维数组中查找目标数
剑指Offer之二维数组中查找目标数 题目描述 在一个二维数组中(每个一维数组的长度相等),每一行都是从左到右递增的顺序排序,每一列都是从上到下递增的顺序排序,输入这样一个二维数组和一个整数,判断 ...
- 《剑指offer(第二版)》面试题55——判断是否为平衡二叉树
一.题目大意 输入一颗二叉树,判断该二叉树是否为平衡二叉树(AVL树). 二.题解 <剑指offer>上给出了两种解决方式: 1.第一种是从根节点开始,从上往下遍历每个子节点并计算以子节点 ...
- 剑指Offer - 九度1348 - 数组中的逆序对
剑指Offer - 九度1348 - 数组中的逆序对2014-01-30 23:19 题目描述: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个 ...
- 剑指Offer - 九度1370 - 数组中出现次数超过一半的数字
剑指Offer - 九度1370 - 数组中出现次数超过一半的数字2013-11-23 03:55 题目描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组 ...
- 剑指Offer - 九度1351 - 数组中只出现一次的数字
剑指Offer - 九度1351 - 数组中只出现一次的数字2013-11-23 01:23 题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. ...
随机推荐
- 动态加载并执行Win32可执行程序
本文所贴出的PoC代码将告诉你如何通过CreateProcess创建一个傀儡进程(称之为可执行程序A),并把dwCreationFlags设置为CREATE_SUSPENDED,然后把另一个可执行程序 ...
- NOPI 基本读写
//获取cell的数据,并设置为对应的数据类型 public object GetCellValue(ICell cell) { object value = null; try { if (cell ...
- HTTP的请求方法一共有9种,有OPTIONS, HEAD, GET, POST等等(消息头有图,十分清楚)
请求方法:指定了客户端想对指定的资源/服务器作何种操作 下面我们介绍HTTP/1.1中可用的请求方法: [GET:获取资源] GET方法用来请求已被URI识别的资源.指定的资源经服务器端解析后 ...
- ubuntu 16.04 android studio 开发环境搭建
安装步骤: 1. 安装 Java developer kit 2.安装 Android developer kit 3.安装 Android studio 4.真机调试 第一次用Linux,命令基本不 ...
- 【MVC 笔记】MVC 自定义 Attribute 属性中的猫腻
原想在 MVC Action 上加一个自定义 Attribute 来做一些控制操作,最先的做法是在自定 Attribute 中定义一个属性来做逻辑判断,可惜事与愿违,这个属性值居然会被缓存起来,于是于 ...
- HTTP通信过程原理
HTTP协议 通信过程介绍 HTTP协议介绍 Http(Hypertext Transfer Protocol)超文本传输协议. Http是应用层协议,当你上网浏览网页的时候,浏览器和服务器之间就会通 ...
- postgresql Java JDBC 一次性传入多个参数到 in ( ?) - multple/list parameters
经常不清楚需要传入多少个参数到 IN () 里面,下面是简单方法: 方法 1 - in ( SELECT * FROM unnest(?)) ) Integer[] ids={1,2,3}; ...
- 开源libco库:单机千万连接、支撑微信8亿用户的后台框架基石
微信于2013年开源的ibco库,是微信后台大规模使用的c/c++协程库,2013年至今稳定运行在微信后台的数万台机器上.libco在2013年的时候作为腾讯六大开源项目首次开源,ibco支持后台敏捷 ...
- 程序跳过UAC研究及实现思路(两种方法,现在可能都不行了)
网上很对跳过UAC资料都是说如果让UAC弹出窗体,并没有真正跳过弹窗,这里结合动态提权+计划任务实现真正意义上的跳过UAC弹窗,运行程序的时候可以不出现UAC窗体,并且程序还是以高权限运行. vist ...
- kube框架结构-一个小型响应式CSS框架
当你开始初建一个新的项目时,你可能需要一个不太复杂的基础框架,Kube框架应该是你最好的选择.一个独立的CSS文件,帮助你更简单的创建响应式的的布局设计. Kube Framework包括网格.按钮. ...