• 【Offer】[3-1] 【找出数组中重复的数字】


    题目描述

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

    思路

    1. 排序后再查找 ❎
    2. 利用哈希表来解决问题,扫描数组中的数字,没扫到一个数字的时候将其加入哈希表中,如果哈希表中包含了该数字,那这个数字就是重复的数字。 ❎
    3. 注意到题目中要求所有的数字都在0~n-1的范围内,可以从哈希表的思路扩展,重新排列数组: 如果向数组中的数字存放到与该数字相等索引位置(交换两数),如果有一个索引位置重复,该数字遍为重复数字。✅

     

    Java代码

    public class Offer003_01 {
        public static void main(String[] args) {
    
            int[] arr = { 3, 5, 7, 8, 8, 6, 2, 4, 1 };
            int[] dupArr = new int[2];
            boolean duplicate = Offer003_01.duplicate(arr, dupArr);
            System.out.println(duplicate);
            System.out.println(dupArr[0]);
        }
    
        public static boolean duplicate(int[] arr, int[] dupArr) {
            return Solution1(arr, dupArr);
        }
    
        /**
         * 
         * 利用哈希表的思路扩展,重新排列数组
         * @param numbers  要传递的数组
         * @return   重复的数字
         */
        public static boolean Solution1(int[] arr, int[] dupArr) {
    
            if (arr == null || arr.length <= 0) {// 判断数组是否为空
                return false;
            }
            for (int i = 0; i < arr.length; i++) {// 判断数组中的数据是否超出范围
                if (arr[i] < 0 || arr[i] > arr.length - 1) {
                    return false;
                }
            }
            for (int i = 0; i < arr.length; i++) {
                while (arr[i] != i) {// 判断 当前元素与自身的下标i 是否相等 不相等的话进入循环
                    if (arr[i] == arr[arr[i]]) {// 判断当前元素 和
                        dupArr[0] = arr[i];
                        return true;
                    }
                    // 目的是为了 使 a[0]=0;a[1]=1 a[2]=2; [2,3,2,1] 的话 a[0] = a[a[0]] =a[2] =2
                    int temp = arr[i];
                    arr[i] = arr[arr[i]];
                    arr[temp] = temp;
                }
            }
            return false;
        }
    
    }
    

    代码链接

    剑指Offer代码-Java

  • 相关阅读:
    【 SSH 配置参考】
    【 SSH 实例】使用ssh开发的简单项目
    【 Hibernate 】Hibernate的session更新和删除失败问题
    【 SSH 整合】Spring、Struts、Hibernate基本整合
    Tower是个不错的项目管理开放平台
    随便写写,四年多了第一次在博客园上发表
    asp.net获取服务器绝对路径和相对路径
    342. 4的幂
    283. 移动零
    268. 缺失数字
  • 原文地址:https://www.cnblogs.com/haoworld/p/boffer31-zhao-chu-shu-zu-zhong-zhong-fu-de-shu-zi.html
Copyright © 2020-2023  润新知