剑指Offer(Java实现):数组中重复的数字

题目
在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。例如,如果输入长度为7的数组{2, 3, 1, 0, 2, 5, 3},那么对应的输出是重复的数字2或者3。

题解
这里用letcode287号题的解题思路,没有用书上的解题思路,具体思路是迭代数组并将每个元素插入 seen 中。在插入之前,我们检查它是否已经存在。如果是,那么我们找到了我们的副本,然后打印它。
复杂度分析
时间复杂度:O(n)。Java 依赖于底层的哈希表,所以插入和查找有固定的时间复杂度。
空间复杂度:O(n),在最坏的情况下,重复元素出现两次,其中一次出现在数组索引 n-1n−1 处。在这种情况下,seen 将包含 n-1n−1 不同的值,因此将占用 O(n) 空间。
代码实现

package Offer;
import java.util.HashSet;
import java.util.Set;

public class FindDuplication03 {

	public static void duplicate(int numbers[]) {
		Set<Integer> seen = new HashSet<Integer>();
		int i = 0;
		if(numbers.length == 0) {
			System.out.println("数组为空!");
		}else {
		for(int num:numbers) {
			if(seen.contains(num)) {
				System.out.println(num);
				i++;
			}
			seen.add(num);
		}
		if(i == 0) {
			System.out.println("没有相同的数字!");
			}
		}
	}
	

	public static void main(String[] args) {
	            //没有重复数字
		        int[] nums1 = new int[]{0,2,3,4,5,6,1,8};
		        duplicate(nums1);
		        System.out.println("-----------------");
		         //多个重复数字
		        int[] nums2 = new int[]{9,2,3,4,5,9,7,1,8,8};
		        duplicate(nums2)
		        System.out.println("-----------------");
		        //数组为空
		        int[] nums3 = new int[]{};
		        duplicate(nums3);

	}
}

输出结果
在这里插入图片描述
tips:
考虑到了书中的测试用例提到的要求,但是没有考虑其它的特殊情况,如有问题欢迎大家指正。

发布了49 篇原创文章 · 获赞 4 · 访问量 2536

猜你喜欢

转载自blog.csdn.net/weixin_42040292/article/details/103571796