数组中任意一个重复的数
问题描述:在一个长度为n的数组里的所有数字都在0到n-1的范围内, 数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每个数字重复几次。请找出数组中任意一个重复的数字。
首先,我们先说一般的方法:可以建立个数组记录,但是需要空间O(n),相信大多数人都会做,这里不详细赘述了。
比较好的方法:如果没重复的数字,应该是一个坑对应一个数字;有重复的情况下,肯定是一个坑对应多个数字。我们只需要找到这个坑就行了。
持续更新...
代码附下
Java实现:
package 找出数组中任意一个重复的数;
public class DuplicateNumber {
public static void main(String[] args) {
// TODO Auto-generated method stub
int a[] = new int[] { 2, 3, 5, 0, 1, 2 };
System.out.println(duplication(a));
}
/**
* 如果下标i对应的a[i]==i,就继续 不是的话,就以a[i]为下标去交换,就是a[a[i]],a[i]交换,重新判断a[i]
*
* @param a
* @return
*/
public static int duplication(int[] a) {
// 常规判断
if (a == null || a.length <= 0) {
return -1;
}
// 判断每一个元素是否非法
for (int i = 0; i < a.length; ++i) {
if (a[i] < 0 || a[i] > a.length - 1)
return -1;
}
for (int i = 0; i < a.length; i++) {
while (i != a[i]) {
if (a[i] == a[a[i]]) {
// 如果这个坑上已经有对应的数字了,那就是重复了
return a[i];
} else {
swap(a, i, a[i]);
}
}
}
return -2;
}
private static void swap(int[] a, int i, int j) {
// TODO Auto-generated method stub
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
持续更新...欢迎赞赏!
https://blog.csdn.net/ustcer_93lk/article/details/80366750如果有问题,欢迎大家留言,有更好的方法也期待大家告知。欢迎赞赏,鼓励知识付费,谢谢!