在一个长度为 n 的数组里的所有数字都在 0 到 n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每个数字重复几次。请找出数组中任意一个重复的数字。
个人理解思路:
因为限制条件是 长度为N ,且数字在N-1 以内,且只需要找出一个任意重复的数字,故可以使用换位置的方法,将数组的值设置为和自己值相等的索引的值,如此循环下去,直到某一个元素的值,作为索引,已经存在,故找到重复的数字,下面是代码
package com.chason.rabbitdemo;/*** <p>description: </p>* <p>Date: 2021/8/26</p>* <p>modify:</p>** @author zhang zhangs@deepblueai.com**/public class DuplicateItemInArr {public static void main(String[] args) {int[] arr = {2, 3, 4, 4, 1, 7};int num = findDuplicate(arr);System.out.println(num);}public static int findDuplicate(int[] nums) {for (int i = 0; i < nums.length; i++) {while (nums[i] != i) {if (nums[i] == nums[nums[i]]) {return nums[i];} else {swap(nums, i, nums[i]);}}swap(nums, i, nums[i]);}return -1;}// value 既是值,也是索引,此方法的目的将索引的设置为该处索引// nums[value] = valuepublic static void swap(int[] nums, int index, int value) {int indexValue = nums[index];nums[index] = nums[value];nums[value] = indexValue;}}
�
