当前位置: 首页 > news >正文

第十六届蓝桥杯省赛 C 组——Java题解1(链表知识点)

5. 冷热数据队列

(1)完整代码:

import java.util.Scanner;
import java.util.LinkedList;
// 1:无需package
// 2: 类名必须Main, 不可修改public class Main {public static void main(String[] args) {Scanner scan = new Scanner(System.in);//在此输入您的代码...int n1=scan.nextInt();int n2=scan.nextInt();int m=scan.nextInt();int[] arr=new int[m];for(int i=0;i<m;i++){arr[i]=scan.nextInt();}scan.close();LinkedList<Integer> q1=new LinkedList<>();LinkedList<Integer> q2=new LinkedList<>();//遍历输入的所有数for(int v:arr) {//情况2:数据在q1,移到q1首部if (q1.contains(v)) {q1.remove((Integer) v);q1.addFirst(v);// 检查q1是否溢出if (q1.size() > n1) {int removed = q1.removeLast();//若q2未满,移到q2首部if (q2.size() < n2) {q2.addFirst(removed);}}} else if (q2.contains(v)) {//情况2:数据在q2中,移到q1首部q2.remove((Integer) v);q1.addFirst(v);//检测q1是否溢出if (q1.size() > n1) {int removed = q1.removeLast();if (q2.size() < n2) {q2.addFirst(removed);}}} else {//情况1:数据不在任何队列,添加到q2首部q2.addFirst(v);//检查q2是否溢出if (q2.size() > n2) {q2.removeLast();}}}// 输出q1的元素for (int i = 0; i < q1.size(); i++) {System.out.print(q1.get(i));if (i != q1.size() - 1) {System.out.print(" ");}}System.out.println();// 输出q2的元素for (int i = 0; i < q2.size(); i++) {System.out.print(q2.get(i));if (i != q2.size() - 1) {System.out.print(" ");}}System.out.println();}
}

(2)解题思路:

1.明确目标:

本题要求模拟 “冷热数据队列” 的操作过程,该队列由热数据队列 q₁(长度 n₁)冷数据队列 q₂(长度 n₂) 组成。那么我们就很容易想到使用链表的知识,可以比较方便的解决。

2.剖析逻辑:

使用LinkedList模拟两个队列,设队列中数据为v,按访问顺序逐个处理数据,分三种情况实现规则逻辑,即

  • 情况 1:v在 q₁中
  • 情况 2:v在 q₂中
  • 情况 3:v不在 q₁和 q₂中

3.分块拿下:

情况 1:v在 q₁中
if (q1.contains(v)) {q1.remove((Integer) v);   // 从q₁中删除vq1.addFirst(v);           // 移到q₁首部// 检查q₁是否溢出if (q1.size() > n1) {int removed = q1.removeLast();  // 淘汰q₁尾部// 若q₂未满,将淘汰数据移到q₂首部if (q2.size() < n2) {q2.addFirst(removed);}}
}
  • 逻辑:先删除 q₁中的v,再将其插入 q₁首部;若 q₁长度超过n₁,删除尾部元素,若 q₂未满则将该元素插入 q₂首部。
情况 2:v在 q₂中
else if (q2.contains(v)) {q2.remove((Integer) v);   // 从q₂中删除vq1.addFirst(v);           // 移到q₁首部// 检查q₁是否溢出if (q1.size() > n1) {int removed = q1.removeLast();if (q2.size() < n2) {q2.addFirst(removed);}}
}
  • 逻辑:先删除 q₂中的v,再将其插入 q₁首部;后续溢出处理同情况 1。
情况 3:v不在 q₁和 q₂中
else {q2.addFirst(v);  // 插入q₂首部// 检查q₂是否溢出if (q2.size() > n2) {q2.removeLast();  // 淘汰q₂尾部}
}
  • 逻辑:将v插入 q₂首部;若 q₂长度超过n₂,删除尾部元素。

(3)涉及知识点:

1. 输入处理:

Scanner scan = new Scanner(System.in);
int n1 = scan.nextInt();
int n2 = scan.nextInt();
int m = scan.nextInt();
int[] arr = new int[m];
for (int i = 0; i < m; i++) {arr[i] = scan.nextInt();
}
scan.close();
  • 知识点:Scanner类的输入读取,数组存储访问序列。
  • 作用:获取 q₁长度n₁、q₂长度n₂、操作次数m和具体访问的m个数据页。

2. 队列初始化:

LinkedList<Integer> q1 = new LinkedList<>();
LinkedList<Integer> q2 = new LinkedList<>();
  • 知识点:LinkedList的初始化。LinkedList是双向链表结构,支持O (1) 时间复杂度的头部插入(addFirst)、尾部删除(removeLast),且提供containsremove(Object)等方法,适合模拟队列的动态操作。

3. 输出队列内容:

// 输出q1
for (int i = 0; i < q1.size(); i++) {System.out.print(q1.get(i));if (i != q1.size() - 1) {System.out.print(" ");}
}
System.out.println();// 输出q2
for (int i = 0; i < q2.size(); i++) {System.out.print(q2.get(i));if (i != q2.size() - 1) {System.out.print(" ");}
}
System.out.println();
  • 逻辑:遍历 q₁和 q₂,逐个输出元素,元素间用空格分隔。

(4)总结:

啵主认为,本题对链表操作的考察较为全面,将之前学习的链表的增删这一块的知识点融入的很好,有很好的练习效果。其中复习的知识点包括:

  • 数据结构:LinkedList的使用(头部插入、尾部删除、元素操作)。
  • 流程控制:多分支条件判断(if-else if-else)和循环遍历。
http://www.dtcms.com/a/574779.html

相关文章:

  • 金仓KReplay:定义数据库平滑迁移新标准
  • 网站建设大型企业微商城平台排行榜前十名
  • 巩义企业网站托管服务商国内网站欣赏
  • TDengine 字符串函数 CONCAT 用户手册
  • 怎样做网站备份网络设计项目
  • 手机网站建设方法大石桥网站制作
  • UOP系统-报表系统使用说明
  • 广州做商城网站dz wordpress互通
  • OpenAI 新音乐、实时3D与影视级叙事:本周AI跨越五大前沿的深度洞察
  • 网站建设ppt演示文档罗湖网站建设的公司哪家好
  • 不仅仅是Morse(攻防世界)
  • 门店到什么地步可以做网站大连哪家做网站比较好
  • Linux 安装宝塔
  • 网站软件下载大全公司微网站怎么做的
  • 公司的网站怎么运营成都网站建设类岗位
  • 优质农产品资源数据库小程序功能设计书
  • seo网站排名优化公司哪家好室内设计网课平台哪个好
  • 网站维护运营北京网站建设华网天下科技
  • 酒店网站做的比较好的网站建设 报告
  • 一般网站开发完周期杭州 定制网站
  • 社区网站建设难点广州企业网站建设哪家服务好
  • 网站seo完整的优化方案做网站最多的行业
  • 通智融合技术:融合AI与通信技术,推动万智互联生态建设
  • 什么网站做装修的如何用普通电脑做网站服务器
  • 种子汤唯梁朝伟做视频网站代驾软件开发公司
  • Linux系统压缩解压指令详解与实例
  • 温州网站 公司甘肃建设厅官方网站项目负责人
  • 广州网站优化方式我要浏览国外网站怎么做
  • 建设银行长清网站python 网站建设 拖拽式
  • 绘画篇(2)