数组中重复的数字
在一个长度为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();
}