记录一下,记录一下,记录一下,因为我的记忆好像只有10s
题目描述:
在一个长度为n的数组里面,所有元素的范围是[0,n-1],数组中可能存在某些数字是重复的,请判断是否有重复元素,如果有,找出来。
解题思路:
从头到尾依次遍历整个数组
,当扫描的数字为
,在序列中的索引为
时,进行如下判断:
如果
,直接扫描下一个。
如果
,将
与
进行比较,如果
,则第一个重复的数字就是
;如果
,则将第
个数字与第
个数字交换,继续遍历。
举例说明:
边界值的考虑:
1、数组声明就得正确:
if(arr == null || arr.length <= 0)
throw new IllegalArgumentException("原数组声明有误");
2、n个元素的范围是[0,n-1],所以元素不能越界:
if(arr[i] > arr.length()&&arr[i] < 0)
throw new IlleagalArgumentException("原数组元素不符合题目要求");
代码:
/**
* @Author: Liming Gong
* @date: 2019/12/6
* @time: 18:10
*定义数组arr[],再定义一个数组repeat[]用于储存找到的重复值。
*/
public class FindDuplicateNum {
public static boolean duplicate(int[] arr, int[] repeat) {
if(arr == null || arr.length <= 0)
throw new IllegalArgumentException("原数组声明有误");
for(int i=0;i<arr.length;i++){
if(arr[i]<0||arr[i]>=arr.length)
throw new IllegalArgumentException("原数组中元素不符合要求");
}
for(int i=0;i<arr.length;i++){
while(arr[i] != i){
if(arr[i] == arr[arr[i]]){
repeat[0] = arr[i];
return true;
}else{
int temp = arr[i];
arr[i] = arr[temp];
arr[temp] = temp;
}
}
}
return false;
}
public static void main(String[] args) {
int[] arr = {2,2,3,1,5,0,4,3};
int[] duplication = new int[1];
System.out.println("是否存在重复数字:"+duplicate(arr,duplication));
System.out.println("重复数字是:"+duplication[0]);
}
}
D:Javajdk1.8.0_221binjava.exe "-javaagent:D:idea2018IntelliJ IDEA 2018.3libidea_rt.jar=55269:D:idea2018IntelliJ IDEA 2018.3bin" -Dfile.encoding=UTF-8 -classpath D:Javajdk1.8.0_221jrelibcharsets.jar;D:Javajdk1.8.0_221jrelibdeploy.jar;D:Javajdk1.8.0_221jrelibextaccess-bridge-64.jar;D:Javajdk1.8.0_221jrelibextcldrdata.jar;D:Javajdk1.8.0_221jrelibextdnsns.jar;D:Javajdk1.8.0_221jrelibextjaccess.jar;D:Javajdk1.8.0_221jrelibextjfxrt.jar;D:Javajdk1.8.0_221jrelibextlocaledata.jar;D:Javajdk1.8.0_221jrelibextnashorn.jar;D:Javajdk1.8.0_221jrelibextsunec.jar;D:Javajdk1.8.0_221jrelibextsunjce_provider.jar;D:Javajdk1.8.0_221jrelibextsunmscapi.jar;D:Javajdk1.8.0_221jrelibextsunpkcs11.jar;D:Javajdk1.8.0_221jrelibextzipfs.jar;D:Javajdk1.8.0_221jrelibjavaws.jar;D:Javajdk1.8.0_221jrelibjce.jar;D:Javajdk1.8.0_221jrelibjfr.jar;D:Javajdk1.8.0_221jrelibjfxswt.jar;D:Javajdk1.8.0_221jrelibjsse.jar;D:Javajdk1.8.0_221jrelibmanagement-agent.jar;D:Javajdk1.8.0_221jrelibplugin.jar;D:Javajdk1.8.0_221jrelibresources.jar;D:Javajdk1.8.0_221jrelibrt.jar;D:java_projectdata12.6outproductiondata12.6 FindDuplicateNum
是否存在重复数字:true
重复数字是:2
Process finished with exit code 0
D:Javajdk1.8.0_221binjava.exe "-javaagent:D:idea2018IntelliJ IDEA 2018.3libidea_rt.jar=55289:D:idea2018IntelliJ IDEA 2018.3bin" -Dfile.encoding=UTF-8 -classpath D:Javajdk1.8.0_221jrelibcharsets.jar;D:Javajdk1.8.0_221jrelibdeploy.jar;D:Javajdk1.8.0_221jrelibextaccess-bridge-64.jar;D:Javajdk1.8.0_221jrelibextcldrdata.jar;D:Javajdk1.8.0_221jrelibextdnsns.jar;D:Javajdk1.8.0_221jrelibextjaccess.jar;D:Javajdk1.8.0_221jrelibextjfxrt.jar;D:Javajdk1.8.0_221jrelibextlocaledata.jar;D:Javajdk1.8.0_221jrelibextnashorn.jar;D:Javajdk1.8.0_221jrelibextsunec.jar;D:Javajdk1.8.0_221jrelibextsunjce_provider.jar;D:Javajdk1.8.0_221jrelibextsunmscapi.jar;D:Javajdk1.8.0_221jrelibextsunpkcs11.jar;D:Javajdk1.8.0_221jrelibextzipfs.jar;D:Javajdk1.8.0_221jrelibjavaws.jar;D:Javajdk1.8.0_221jrelibjce.jar;D:Javajdk1.8.0_221jrelibjfr.jar;D:Javajdk1.8.0_221jrelibjfxswt.jar;D:Javajdk1.8.0_221jrelibjsse.jar;D:Javajdk1.8.0_221jrelibmanagement-agent.jar;D:Javajdk1.8.0_221jrelibplugin.jar;D:Javajdk1.8.0_221jrelibresources.jar;D:Javajdk1.8.0_221jrelibrt.jar;D:java_projectdata12.6outproductiondata12.6 FindDuplicateNum
Exception in thread "main" java.lang.IllegalArgumentException: 原数组中元素不符合要求
at FindDuplicateNum.duplicate(FindDuplicateNum.java:12)
at FindDuplicateNum.main(FindDuplicateNum.java:33)
Process finished with exit code 1