1.找出数组中重复数字

给定一个长度为 n的整数数组 nums,数组中所有的数字都在 0∼n−1的范围内。
数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。
请找出数组中任意一个重复的数字。

注意:如果某些数字不在 0∼n−1的范围内,或数组中不包含重复数字,则返回 -1;

数据范围:

0≤n≤1000

样例:

给定 nums = [2, 3, 5, 4, 3, 2, 6, 7]。
返回 2 或 3。

代码:

class Solution {
    public int duplicateInArray(int[] nums) {
        // n为nums数组长度
        int n = nums.length;
        // 第一遍检查,确保所有数字都在合法范围内[0,n-1]
        // 如果有数字不在合法范围内,则直接返回-1
        for(int i = 0;i < n;i++){
            if(nums[i]<0||nums[i]>=n)return -1;
        }
        // 第二遍:利用原地交换的方法找到重复的数字
        for(int i = 0;i<n;i++){
            // 如果nums[i]!=nums[nums[i]]表示数组中下标为nums[i]上的元素位置不正确
            // 此时交换nums[i]和nums[nums[i]],将nums[i]放在正确的位置nums[nums[i]]上
            // 不断交换直到不能交换为止
            while(nums[i]!=nums[nums[i]])swap(i,nums[i],nums);
            // 如果当前位置i所对应的值不是i,说明找到了重复数字
            if(nums[i]!=i)return nums[i];
        }
        // 如果没有找到重复数字,返回-1
        return -1;
    }
    // 交换数组中两个位置的元素
    public void swap(int x,int y,int[] nums){
        int temp = nums[x];
        nums[x] = nums[y];
        nums[y] = temp;
    }
}
posted @ 2025-05-12 09:16  回忆、少年  阅读(16)  评论(0)    收藏  举报