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

引用声明

该题目引用自
牛客网