• 剑指offer 数组中的重复数字


    问题描述:

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

    解题思路:

    1、判断输入数组有无元素非法 
    2、从头扫到尾,只要当前元素值与下标不同,就做一次判断,numbers[i]与numbers[numbers[i]],相等就认为找到了重复元素,返回true,否则就交换两者,继续循环。直到最后还没找到认为没找到重复元素,返回false

    算法:

    /**
     * 找到数组中重复的数字
     * 问题描述:在长度为n的数组中,所有的元素都是0到n-1的范围内。
     * 数组中的某些数字是重复的,但不知道有几个重复的数字,也不知道重复了几次,请找出任意重复的数字。
     * 例如,输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出为2或3
     *
     */
    public class DuplicateNumber {
    
        public static void main(String[] args) {
            int[] array = {2,3,1,0,2,5,3};
            int duplicate = duplicateNumber(array);
            System.out.println("重复的数字为: " + duplicate);
        }
    
        /**
         * 求数组中重复的数字
         * 分析:如果数组中没有重复的数字,则第i位置应该放置的数字为i。可以重排此数组,让对应位置上的数字对应。
         */
        private static int duplicateNumber(int[] array) {
            // TODO Auto-generated method stub
            if(array == null || array.length <= 0){
                return -1;
            }
            for(int i=0;i<array.length;i++){ //判断输入数组的合法性
                if(array[i] < 0 || array[i] >= array.length){
                    return -1;
                }
            }
            for(int i=0;i<array.length;i++){
                if(i != array[i] && array[i] == array[array[i]]){ //重复数据
                    return array[i];
                }
                while(i != array[i]){ //将数字与第m个位置上的数字交换
                    exchange(array, i, array[i]);
                }
            }
            return -1;
        }
        
        /**
         * 交换数组array中的第i位和第j位
        public static void exchange(int[] array, int i, int j){
            int temp = array[i];
            array[i] = array[j];
            array[j] = temp;
        }
    }
  • 相关阅读:
    [RxSwift教程]14、其他操作符:delay、materialize、timeout等
    [RxSwift教程]13、连接操作符:connect、publish、replay、multicast
    Java虚拟机类加载机制及双亲委派模式分析
    面试系列-如何设计一个类
    谈谈 MySQL 的 JSON 数据类型
    Java 多线程编程(2-异步中包含同步)
    还堵在高速路上吗?带你进入Scratch世界带你飞
    SQL Server SSIS相关介绍
    SQL Server开启READ_COMMITTED_SNAPSHOT
    SqlServer中select语句引起的死锁
  • 原文地址:https://www.cnblogs.com/liuwanqiu/p/8491579.html
Copyright © 2020-2023  润新知