面试笔试 场景题(部分总结)

文章目录

    • 题目--找出一堆随机数中的前 k 大数字
      • PriorityQueue 类
      • PriorityQueue 常用方法
    • 题目--数组中的第 K 个最大元素
    • 题目--二叉搜索树中第 K 小的元素

题目–找出一堆随机数中的前 k 大数字

找出一堆随机数中的前 k 数字(小根堆),找出一堆随机数中的前 k 数字(大根堆)。都一样

方法:快速排序。 最小堆法。

如果不了解堆这个数据结构:点击查看堆

最小堆法:
当数组规模很大时,排序的时间复杂度较高。为了优化,可以使用最小堆(Min-Heap)。在 Java 中可以利用 PriorityQueue 实现一个固定大小为 k 的最小堆来解决问题。

public static void main(String[] args) {
    int[] nums = {57, 32, 56, 20, 54, 99, 47, 8, 35, 23, 30, 29, 63, 69, 58};
    int k = 5; // 前k大

    // 最小堆
    PriorityQueue<Integer> minHeap = new PriorityQueue<>(k);

    // 遍历数组,维护最小堆
    for (int num : nums) {
        minHeap.offer(num);
        if (minHeap.size() > k) {
            minHeap.poll(); // 移除堆顶 即数组第一个元素
        }
    }

    System.out.println("前 " + k + " 大的数: ");
    while (!minHeap.isEmpty()) {
        System.out.print(minHeap.poll() + " ");
    }
}

PriorityQueue 类

PriorityQueue 是 Java 中实现堆(Heap)数据结构的一个重要类,它基于优先级队列(Priority Queue)的概念。它使用来实现,默认是最小堆,即堆顶是队列中最小的元素。也可以通过传递自定义的比较器来实现最大堆。

PriorityQueue的底层实现是使用一个数组来进行节点的存储

PriorityQueue 默认最小堆:
优先级队列表示为平衡二叉堆:queue[n] 的两个子节点为queue[2n+1] 和queue[2(n+1)]。优先级队列按比较器排序,如果比较器为空,则按元素的自然顺序排序:对于堆中的每个节点 n 和 n 的每个后代 d,n <= d。假设队列非空,则具有最小值的元素位于queue[0]中。【默认最小堆】
在这里插入图片描述

PriorityQueue 实现大根堆:
大根堆,则数组第一个元素最大
new PriorityQueue<>(Comparator.reverseOrder()) 传入一个参数即可

 public static void main(String[] args) {
     // 自定义比较器,将 PriorityQueue 变为最大堆
     PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Comparator.reverseOrder());

     maxHeap.offer(10);
     maxHeap.offer(40);
     maxHeap.offer(20);
     maxHeap.offer(30);

     System.out.println("最大堆中的元素:");
     while (!maxHeap.isEmpty()) {
         System.out.print(maxHeap.poll() + " "); // 输出时将从大到小
     }
 }

PriorityQueue 的特性:

  1. 自动排序:

    • PriorityQueue 会根据元素的优先级自动排序,默认排序方式是最小堆,意味着堆顶元素是队列中最小的元素。
    • 如果需要实现最大堆,可以传入一个自定义的比较器,使得元素按照降序排列。
  2. 不允许 null 元素:

    • PriorityQueue 不允许插入 null 元素,否则会抛出 NullPointerException
      在这里插入图片描述
  3. 线程不安全:

    • PriorityQueue 不是线程安全的。如果需要在多线程环境下使用,可以使用 PriorityBlockingQueue
  4. 时间复杂度:

    • 插入(offer())和删除最小元素(poll())的时间复杂度均为 O(log n),其中 n 是队列的大小。
    • 获取队列中最小元素的时间复杂度是 O(1),即通过 peek() 方法。

PriorityQueue 常用方法

方法名描述
add(E e)插入元素 e 到队列中,若违反队列容量限制,抛出 IllegalStateException
offer(E e)插入元素 e 到队列中,返回 true 表示插入成功,若违反容量限制返回 false
poll()获取并移除队列的堆顶元素(即最小元素),若队列为空则返回 null
peek()获取但不移除队列的堆顶元素(即最小元素),若队列为空则返回 null
remove(Object o)从队列中移除指定的元素 o
isEmpty()检查队列是否为空。
size()返回队列的元素个数。
clear()清空队列中的所有元素。
contains(Object o)检查队列中是否包含指定的元素 o

题目–数组中的第 K 个最大元素

这个题也可以利用 PriorityQueue 秒了
在这里插入图片描述

public int findKthLargest(int[] nums, int k) {
      PriorityQueue<Integer> queue = new PriorityQueue<>();
      for (int num : nums) {
          queue.offer(num);
          if (queue.size() > k) {
              queue.poll();
          }
      }
      return queue.peek();
  }

题目–二叉搜索树中第 K 小的元素

这个题也可以利用 PriorityQueue 秒了
在这里插入图片描述

你使用最大堆来找出第 k 小的元素。最大堆的特点是堆顶元素是当前堆中的最大值。

  • 创建一个最大堆(PriorityQueue,指定了 Comparator.reverseOrder() 来使其成为最大堆)。

  • 当堆的大小超过 k 时,移除堆顶元素(即当前最大元素)。这样,堆中总是保持 k 个最小的元素,堆顶始终是这 k 个元素中的最大值。

方法1:

 public int kthSmallest(TreeNode root, int k) {
     if (root == null) return 0;
     ArrayList<Integer> list = new ArrayList<>();

     Queue<TreeNode> queue = new LinkedList<>();
     queue.offer(root);
     while (!queue.isEmpty()) {
         TreeNode node = queue.poll();
         list.add(node.val);
         if (node.left != null) queue.offer(node.left);
         if (node.right != null) queue.offer(node.right);
     }
     // 二叉搜索树中第 K 小的元素
     PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Comparator.reverseOrder());
     for (Integer i : list) {
         maxHeap.offer(i);
         if (maxHeap.size() > k) {
             maxHeap.poll();
         }
     }
     return maxHeap.peek();
 }

方法2:利用二叉搜索树性质,中序遍历是有序的

 public int kthSmallest(TreeNode root, int k) {
        if (root == null) return 0;
        // 利用中序遍历来获取第 k 小的元素
        Stack<TreeNode> stack = new Stack<>();
        TreeNode current = root;
        int count = 0;
        int res = root.val;
        while (current != null || !stack.isEmpty()) {
            // 先遍历左子树
            while (current != null) {
                stack.push(current);
                current = current.left;
            }
            // 当前节点
            current = stack.pop();
            count++;
            // 当第 k 小的元素出现时返回该元素
            if (count == k) {
                res = current.val;
                break;
            }
            // 遍历右子树
            current = current.right;
        }
        return res;
    }

方法3:递归中序遍历

int res = 0;
int count = 0;

public int kthSmallest(TreeNode root, int k) {
    if (root == null) return 0;
    kthSmallest(root.left, k);
    count += 1;
    if (k == count) {
        res = root.val;
    }
    kthSmallest(root.right, k);
    return res;
}


❤觉得有用的可以留个关注~❤

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/873784.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

捷途山海T2纯电续航突破200km,直达208km!

若你向我询问“方盒子”造型的SUV该如何选择&#xff0c;我会毫不犹豫地推荐捷途山海T2。这款车型以其独特的硬派风格&#xff0c;在众多SUV中脱颖而出。不同于坦克300和北京BJ40的单一性格&#xff0c;捷途山海T2在双电机与高性能电池组的共同加持下&#xff0c;展现出了更为全…

大模型好书分享:《精通Transformer,从零开始构建最先进的NLP模型》(附PDF)

这本大模型书籍我已经上传CSDN&#xff0c;朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】 内容简介 国内第1本Transformer——变形金刚红书 如果一定要说未来谁能引领人工智能世界&#xff0c;是Transformer而非chatGPT&#xff01; 编…

python-新冠病毒

题目描述 假设我们掌握了特定时间段内特定城市的新冠病毒感染病例的信息。在排名 i 的当天有 i 个案例&#xff0c;即&#xff1a; 第一天有一例感染第二天有两例感染第三天有三例感染以此类推...... 请计算 n 天内的感染总数和每天平均感染数。 输入 整数 n 表示天数&…

免费的文章生成器有哪些?盘点5款为你自动生成文章

文章生成器的普及&#xff0c;为创作者提供了全新的创作视角和效率提升途径。那么&#xff0c;市面上有哪些免费的文章生成器可供我们使用呢&#xff1f;接下来&#xff0c;本文将为大家详细介绍5款功能强大、操作简便的免费文章生成器&#xff0c;它们将有助大家在内容创作的道…

基于人工智能的智能农业监控系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 智能农业是利用现代信息技术和人工智能进行农业生产的优化管理&#xff0c;通过实时监控和预测系统&#xff0c;可以改善作物的生产效…

KAN 学习 Day4 —— MultKAN 正向传播代码解读及测试

在KAN学习Day1——模型框架解析及HelloKAN中&#xff0c;我对KAN模型的基本原理进行了简单说明&#xff0c;并将作者团队给出的入门教程hellokan跑了一遍&#xff1b; 在KAN 学习 Day2 —— utils.py及spline.py 代码解读及测试中&#xff0c;我对项目的基本模块代码进行了解释…

顶级出图效果!免费在线使用FLux.1 模型,5s出图无限制!

最近发现一个可以在线免费使用 FLux.1 模型 生成图片的AI工具。 先看效果图&#xff1a; 工具不需要登录即可使用&#xff0c;目前还是完全免费的&#xff0c;国内可以直接使用。 在提示词输入框直接输入提示词即可&#xff0c;选择图片比例之后&#xff0c;直接生图。 出图的…

24年9月通信基础知识补充1

看文献过程中不断发现有太多不懂的基础知识&#xff0c;故长期更新这类blog不断补充在这过程中学到的知识。由于这些内容与我的研究方向并不一定强相关&#xff0c;故记录不会很深入请见谅。 【通信基础知识补充2】9月通信基础知识补充1 一、Zadoff-Chu 序列1.1 Zadoff-Chu 序列…

3GPP协议入门——物理层基础(一)

1. 频段/带宽 NR指定了两个频率范围&#xff0c;FR1&#xff1a;通常称Sub 6GHz&#xff0c;也称低频5G&#xff1b;FR2&#xff1a;通常称毫米波&#xff08;Millimeter Wave&#xff09;&#xff0c;也称高频5G。 2. 子载波间隔 NR中有15kHz&#xff0c;30kHz&#xff0c;6…

C++——入门基础(下)

目录 一、引用 &#xff08;1&#xff09;引用的概念和定义 &#xff08;2&#xff09;引用的特性 &#xff08;3&#xff09;引用的使用 &#xff08;4&#xff09;const引用 &#xff08;5&#xff09;指针和引用的关系 二、inline 三、nullptr 四、写在最后 一、引用…

带相对位置表示的自注意力(201803)

Self-Attention with Relative Position Representations 带相对位置表示的自注意力 https://arxiv.org/pdf/1803.02155v1 Abstract Relying entirely on an attention mechanism, the Transformer introduced by Vaswani et al. (2017) achieves state-of-the-art results …

【加密社】比特币海量数据问题解决方案

加密社 比特币是无敌的存在&#xff0c;刚翻了一遍中本聪的论文&#xff08;其实以前看过一次&#xff0c;那时不明觉厉&#xff09;&#xff0c;发现咱们一直在考虑的问题&#xff0c;基本都能在其论文上找到解决方案了。。 现在出现的这些问题&#xff0c;完全是因为bitcoin…

4千6历年高考英语试题大全ACCESS\EXCEL数据库

《历年高#考英语试题大全ACCESS数据库》搜集了大量的全#国各#地高#考英语模拟试题&#xff0c;每道题目均有相应的答案和解析&#xff1b;这种数据虽然没有《一站到底》类的数据结构&#xff08;一个选项一个字段&#xff09;那么好&#xff0c;但是通过技术人员还是可以很简单…

自适应中值滤波器:图像去噪的高效解决方案

在数字图像处理中&#xff0c;椒盐噪声是常见的干扰之一&#xff0c;它会导致图像出现随机的黑点和白点&#xff0c;严重影响图像质量。传统的中值滤波器虽然在一定程度上能够去除这种噪声&#xff0c;但可能无法完全恢复图像的细节。为此&#xff0c;本文将介绍一种自适应中值…

k8s上搭建devops环境

一、gitlab 1.安装gitlab # 下载安装包 wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-15.9.1-ce.0.el7.x86_64.rpm # 安装 rpm -i gitlab-ce-15.9.1-ce.0.el7.x86_64.rpm # 编辑 vi /etc/gitlab/gitlab.rb 文件 # 修改 external_url 访问路径 htt…

【网络安全】分析JS文件实现账户接管

未经许可,不得转载。 文章目录 正文正文 网站使用的是简单的OTP(一次性密码)验证机制,通过用户注册时提供的电子邮件发送邮箱验证码。在功能有限的情况下,我选择去分析网站加载的JavaScript文件。 我发现了一个名为 saveJobseekerPasswordInCache 的函数: 这个函数虽然…

vscode侧边工具栏不见了找回方法

有时候因为误操作&#xff0c;vscode编辑器里面的侧边工具栏不见了找回方法&#xff0c;请按照以下步骤操作。 例:1&#xff1a;这个工具栏不见了 方法&#xff1a;菜单栏点击文件》点击首选项》点击设置》点击工作台》点击外观》勾选如下图选项 例如2&#xff1a;蓝控制台底…

无人机之穿越机的飞行模式

穿越机的飞行模式主要分为两种基本类型&#xff1a;自稳模式&#xff08;ANGLE MODE&#xff09;和手动模式&#xff08;ACRO MODE&#xff09;&#xff0c;以及一些衍生的飞行模式&#xff0c;如半自稳模式&#xff08;Horizon Mode&#xff09;等。下面将详细介绍这两种基本模…

vulhub think PHP 2-rce远程命令执行漏洞

1.开启环境 2。访问对应网站端口 3.这里我们直接构造payload&#xff0c;访问phpinfo() http://192.168.159.149:8080/?s/Index/index/L/${phpinfo()} 4.可以访问到我们的phpinfo&#xff0c; 所以写入一句话木马&#xff0c;也可使用蚁剑进行连接&#xff0c;获得其shell进…

云计算之大数据(下)

目录 一、Hologres 1.1 产品定义 1.2 产品架构 1.3 Hologres基本概念 1.4 最佳实践 - Hologres分区表 1.5 最佳实践 - 分区字段设置 1.6 最佳实践 - 设置字段类型 1.7 最佳实践 - 存储属性设置 1.8 最佳实践 - 分布键设置 1.9 最佳实践 - 聚簇键设置 1.10 最佳实践 -…