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))
}

引用声明

该题目引用自
牛客网