数组中重复的数字

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

实现

  • 数组排序
    排序后,从头到尾扫描
public static ArrayList<Integer> getDuplicate(Integer[] nums) {
	ArrayList<Integer> result = new ArrayList<>();
	Arrays.sort(nums);
	boolean mark = false;//是否连续

	for (int i = 1; i < nums.length; i++) {
		if (nums[i - 1].equals(nums[i])) {
			if (!mark) {
				result.add(nums[i]);
				mark = true;
			}
		} else {
			mark = false;
		}

	}
	return result;
}
  • 哈希表
public static ArrayList<Integer> getDuplicate(Integer[] nums) {
	ArrayList<Integer> result = new ArrayList<>();
	HashSet<Integer> set = new HashSet<>();
	for (int i = 0; i < nums.length; i++) {
		if (!set.contains(nums[i])) {
			set.add(nums[i]);
		} else {
			result.add(nums[i]);
		}
	}
	return result;
}
  • 重排数组
public static ArrayList<Integer> getDuplicate(Integer[] nums) {
	ArrayList<Integer> result = new ArrayList<>();
	
	for (int i = 0; i < nums.length; i++) {
		while (nums[i] != i) {
			//此时数组中下标为i 的数值也是i  则重复
			if (nums[i].equals(nums[nums[i]])) {
				result.add(nums[i]);
				break;
			}
			swap(nums, i, nums[i]);
		}
	}
	return result;
}

private static void swap(Integer[] nums, int i, Integer j) {
	int temp;
	temp = nums[i];
	nums[i] = nums[j];
	nums[j] = temp;
}

测试用例

public void test() {
	Integer[] a = {1, 2, 3, 2, 3};
	ArrayList<Integer> r = getDuplicate01(a);
	System.out.println("重复数字为:" + r);
}

输出结果

重复数字为:[2, 3]

扩展

/**
 * a(5)b(4)c(3)d(2)e(1)
 */
public static String getDuplicate04(char[] nums) {

	StringBuilder sb = new StringBuilder();
	Arrays.sort(nums);
	int count = 1;
	sb.append(nums[0]);
	for (int i = 1; i < nums.length; i++) {
		if (nums[i - 1]==(nums[i])) {
			count++;
		} else {
			sb.append("(" + count + ")");
			count = 1;
			sb.append(nums[i]);
		}
	}
	sb.append("(" + count + ")");
	return sb.toString();
}
posted @ 2019-08-30 16:39  tangmeng  阅读(203)  评论(0编辑  收藏  举报