数据结构

2018-03-19  本文已影响5人  油麦
public static int duplicate(int[] nums) {
        int length = nums.length;
        // 增加鲁棒性,如果数组为空或者长度为0
        if (nums == null || length <= 0)
            return -1;
        // 控制外部循环
        for (int i = 0; i < length; i++) {
            // 如果key和value不想等,而且value为索引的对应的值也不相等的话
            // 第二个条件是因为当找到相同数字时也是和索引不一样
            while (nums[i] != i && nums[i] != nums[nums[i]]) {
                // 交换两个key为索引和 value为索引的两个数字的值
                swap(nums, i, nums[i]);
            }
            // 如果key和value的值相等,而且value的值等于以value为索引的值
            if (nums[i] != i && nums[i] == nums[nums[i]]) {
                return nums[i];
            }
        }
        return -1;
    }
    // 交换两个数字
private static void swap(int[] nums, int i, int j) {
        int t = nums[i];
        nums[i] = nums[j];
        nums[j] = t;
    }  

测试用例:
正常情况:长度为n的数组包含一个或者多个重复数字
正常情况:不包含重复的数字
无效的输入用例:空指针,长度为n的数组包含含有0~n-1以外的数字,长如为0的数组

上一篇下一篇

猜你喜欢

热点阅读