1. 数组中重复的数字
题目描述
在一个长度为 n 的数组里的所有数字都在 0 到 n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每个数字重复几次。请找出数组中任意一个重复的数字。
解题思路
要求时间复杂度 O(N),空间复杂度 O(1)。因此不能使用排序的方法,也不能使用额外的标记数组。
对于这种数组元素在 [0, n-1] 范围内的问题,可以将值为 i 的元素调整到第 i 个位置上进行求解。本题要求找出重复的数字,因此在调整过程中,如果第 i 位置上已经有一个值为 i 的元素,就可以知道 i 值重复。
代码实现
java 代码
/**
* 寻找数组中的重复数字并返回,如果没有找到,返回-1
*/
private int duplicate(int[] arr){
if(arr==null){
return -1;
}
for(int i=0;i<arr.length;i++){
while (i!=arr[i]){//判断当前位置上的元素是否和当前位置数值相同,如果不相同,则寻找和当前位置数字相同的值
if(arr[i]==arr[arr[i]]){//判断如果当前位置的元素和以该元素为下标的元素相同时,则寻找到重复数字,返回盖重复数字;如果不相同,则进行元素交换
return arr[i];
}
swap(arr,i,arr[i]);
}
}
return -1;
}
/**
* 对数组中的元素进行交换
* @param arr 需要交换元素的数组
* @param i 需要交换的元素下标
* @param j 需要交换的元素下标
*/
private void swap(int[] arr, int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
public static void main(String[] args){
int[] arr = {1,4,3,1,2,5,0,0};
System.out.println(duplicate(arr));
}
Kotlin 代码
/**
* 寻找数组中的重复数字并返回,如果没有找到,返回-1
*/
private fun duplicate(array: Array<Int>):Int{
for (i in array.indices) {
while (i!=array[i]){//判断当前位置上的元素是否和当前位置数值相同,如果不相同,则寻找和当前位置数字相同的值
if(array[i]==array[array[i]]){//判断如果当前位置的元素和以该元素为下标的元素相同时,则寻找到重复数字,返回盖重复数字;如果不相同,则进行元素交换
return array[i]
}
swap(array,i,array[i])//元素交换
}
}
return -1
}
/**
* 对数组中的元素进行交换
* @param arr 需要交换元素的数组
* @param i 需要交换的元素下标
* @param j 需要交换的元素下标
*/
private fun swap(array: Array<Int>,i: Int, j: Int) {
val tmp = array[i]
array[i] = array[j]
array[j] = tmp
}
/**
* 入口函数
*/
fun main(args: Array<String>) {
val array:Array<Int> = arrayOf(1,4,3,1,2,5,0,0)
println(duplicate(array))
}
引用声明
该题目引用自
牛客网