您的位置:首页 > Web前端

1、找出数组中任意重复的数字——《剑指offer》

2018-05-18 17:11 591 查看
版权声明: https://blog.csdn.net/ustcer_93lk/article/details/80366750

数组中任意一个重复的数

问题描述:在一个长度为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

如果有问题,欢迎大家留言,有更好的方法也期待大家告知。欢迎赞赏,鼓励知识付费,谢谢!

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐