【数据结构】数组及常见的面试题

前言

  首先理解数据结构的概念,数据结构是计算机存储、组织数据的方式。相互之间存在一种或多种特定关系的数据元素的集合。选择一种合适的数据结构可以实现更高的运行或存储效率。
   数据结构往往同高效的检索算法和索引技术有关。数据结构主要研究数据的逻辑结构,划分为:线性结构和非线性结构。常用的数据结构:数组Array、栈Stack、队列Queue、链表Linked List、树Tree、图Graph、堆Heap和散列表Hash等。
   下面先介绍数组的基本内容和常见的面试题。

数组概念

  1.有序的元素序列,储存多个相同类型数据的集合。
  2.组成数组的各个变量成为数组的分量,即数组的元素或下标变量。
  3.把相同类型的若干元素按无序的形式组织起来。

数组面试题

一、在未排序的整数数组中找到最大值与最小值

   使用一层循环,假设第一个数最大或最小
 public static void main(String[] args) {
        int[] setArray={5,2,1,7,10,56};
        int max=setArray[0];
        int min=setArray[0];
        for (int i = 0; i <setArray.length ; i++) {
            if (max<setArray[i]) {
                max=setArray[i];
            }
            if (min>setArray[i]) {
                min=setArray[i];
            }
        }
        System.out.println(max+"最大,"+min+"最小");
    }

二、请在给出的整数数组中找到重复的数字

  1.第一种方法:两层循环
/**
     * 方法一: 两层循环
     */
    public static void test1() {
        int[] setArray = {5, 6, 8, 8, 5, 10, 6, 10, 9};
        System.out.println("重复的数字如下:");
        for (int i = 0; i < setArray.length; i++) {
            for (int j = i + 1; j < setArray.length; j++) {
                if (setArray[i] == setArray[j]) {
                    System.out.print(setArray[j] + " ");
                }
            }
        }
    }

  2 第二种方法 .使用HashMap

 /**
     * 方法二: HashMap key 存放数字,value 存放出现的次数
     */
    public static void test2() {
        int[] setArray = {5, 6, 8, 8, 5, 10, 6, 10, 9, 5, 5};
        HashMap<Integer, Integer> map = new HashMap<>();
        System.out.println("重复的数字如下:");
        for (Integer integer : setArray) {
            if (map.containsKey(integer)) {
                map.put(integer, map.get(integer) + 1);
            } else {
                map.put(integer, 1);
            }
        }
        Iterator iterator = map.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry entry = (Map.Entry) iterator.next();
            if ((int) (entry.getValue()) > 1) {
                System.out.print(entry.getKey() + " ");
            }
        }
        System.out.println(map.toString());

    }

三、找到1到100中丢失的数字

  1.第一个方法:两个数组实现,利用桶原理
/**
     * 1 生成一个指定大小的数组,数字重复
     *
     * @param size     数组实际大小
     * @param capacity 数组容量
     */
    private static void test1(int size, int capacity) {

        int[] arrayMiss = new int[size];
        int[] arrayAll = new int[capacity];

        if (size > capacity) {
            System.out.println("size 不能大于数组最大容量capacity");
            return;
        }

        /**
         * 生成两个数组
         */
        System.out.println("生成随机数组");
        int randNum;
        Random random=new Random();
        for (int i = 0; i <= capacity; i++) {
            randNum = random.nextInt(capacity);
            if (i < size) {
                arrayMiss[i] = randNum;
                System.out.print(randNum + " ");
            }
        }

        /**
         * 将缺失数组的对应数字放到对应的既定数组中
         */
        for (int i = 0; i < arrayMiss.length; i++) {
            arrayAll[arrayMiss[i]] = arrayMiss[i];
        }
        System.out.println();
        System.out.println("缺失的数字:");
        for (int i = 1; i < arrayAll.length; i++) {
            if (arrayAll[i] == 0) {
                System.out.print(i+" ");
            }
        }


    }

  运行结果
在这里插入图片描述

  2.第二个方法:使用两个Set集合,利用Set无序不重复的特点

public static void test2() {

        Set<Integer> setMiss = new HashSet<>();
        Set<Integer> setAll = new HashSet<>();
        Boolean isContain = false;
        int randNum = 0;
        Random rand = new Random();
        System.out.println("随机数组");
        for (int i = 0; i < 100; i++) {
            randNum = rand.nextInt(100);
            if (randNum != 0) {
                setMiss.add(randNum);
            }
            setAll.add(i + 1);
            System.out.print(randNum + " ");
        }
        System.out.println();
        System.out.println("丢失的数字");
        for (int num : setAll) {
            isContain = setMiss.contains(num);
            if (!isContain) {
                System.out.print(num + " ");
            }
        }
    }

小结

  解决这几个问题的过程中,假设最大最小值的思想,借助第二个数组的思想,都在数组试题中有所体现。
感谢您的访问!
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值