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

    个人理解思路:
    因为限制条件是 长度为N ,且数字在N-1 以内,且只需要找出一个任意重复的数字,故可以使用换位置的方法,将数组的值设置为和自己值相等的索引的值,如此循环下去,直到某一个元素的值,作为索引,已经存在,故找到重复的数字,下面是代码

    1. package com.chason.rabbitdemo;
    2. /**
    3. * <p>description: </p>
    4. * <p>Date: 2021/8/26</p>
    5. * <p>modify:</p>
    6. *
    7. * @author zhang zhangs@deepblueai.com
    8. **/
    9. public class DuplicateItemInArr {
    10. public static void main(String[] args) {
    11. int[] arr = {2, 3, 4, 4, 1, 7};
    12. int num = findDuplicate(arr);
    13. System.out.println(num);
    14. }
    15. public static int findDuplicate(int[] nums) {
    16. for (int i = 0; i < nums.length; i++) {
    17. while (nums[i] != i) {
    18. if (nums[i] == nums[nums[i]]) {
    19. return nums[i];
    20. } else {
    21. swap(nums, i, nums[i]);
    22. }
    23. }
    24. swap(nums, i, nums[i]);
    25. }
    26. return -1;
    27. }
    28. // value 既是值,也是索引,此方法的目的将索引的设置为该处索引
    29. // nums[value] = value
    30. public static void swap(int[] nums, int index, int value) {
    31. int indexValue = nums[index];
    32. nums[index] = nums[value];
    33. nums[value] = indexValue;
    34. }
    35. }

    WechatIMG13.jpeg