问题描述
找出数组中重复的数字。
在一个长度为n的数组nums里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
其中n大于等于2,小于等于100000。
方法一:先排序后遍历
思路:
最简单的暴力,直接排序,判断当前元素是否和下一个元素相同。
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String[] input = scanner.nextLine().split(" ");
int[] nums = new int[input.length];
for (int i = 0; i < nums.length; i++) {
nums[i] = Integer.parseInt(input[i]);
}
System.out.println(findRepeatNumber(nums));
}
public static int findRepeatNumber(int[] nums) {
Arrays.sort(nums);
for (int i = 0; i < nums.length-1; i++) {
if (nums[i] == nums[i+1]) return nums[i];
}
return 0;
}
}
方法二:哈希集合加遍历
import java.util.HashSet;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String[] input = scanner.nextLine().split(" ");
int[] nums = new int[input.length];
for (int i = 0; i < nums.length; i++) {
nums[i] = Integer.parseInt(input[i]);
}
System.out.println(findRepeatNumber(nums));
}
public static int findRepeatNumber(int[] nums) {
HashSet<Integer> set = new HashSet<>();
for (int i = 0; i < nums.length; i++) {
if (set.contains(nums[i])) return nums[i];
else set.add(nums[i]);
}
return 0;
}
}
方法三:利用索引
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String[] input = scanner.nextLine().split(" ");
int[] nums = new int[input.length];
for (int i = 0; i < nums.length; i++) {
nums[i] = Integer.parseInt(input[i]);
}
System.out.println(findRepeatNumber(nums));
}
public static int findRepeatNumber(int[] nums) {
for (int i = 0; i < nums.length; i++) {
while (nums[i] != i) {
if (nums[nums[i]] == nums[i]) {
return nums[i];
}
else {
int temp = nums[nums[i]];
nums[nums[i]] = nums[i];
nums[i] = temp;
}
}
}
return 0;
}
}