数组-链表--乘车按序就座
描述
我们规定乘坐公共交通工具时,正常情况下乘客按序列号 number
的升序顺序排队就座,当乘客中有年龄 age
小于 5
岁(不含 5 岁)的幼儿乘客或是年龄 age
大于 60
岁(不含 60 岁)的老年人乘客时,优先按序就座。现在给你一个乘客列表,请你安排他们按序就座,结果请通过调用 System.out.println
方法进行输出。
样例
样例一
输入:
Jack 21
Jimi 69
July 52
July 42
Jane 70
输出:
number = 1, name = Jimi, age = 69
number = 4, name = Jane, age = 70
number = 0, name = Jack, age = 21
number = 2, name = July, age = 52
number = 3, name = July, age = 42
样例二
输入:
LingHu 65
Haly 59
Jack 24
Jane 2
Fualy 36
输出:
number = 0, name = LingHu, age = 65
number = 3, name = Jane, age = 2
number = 1, name = Haly, age = 59
number = 2, name = Jack, age = 24
number = 4, name = Fualy, age = 36
解题思路
题目要求:
- 乘客年龄
age
小于5岁或是大于60岁的乘客,优先按序就座 - 乘客需要按序列号
number
的升序顺序排队就坐
方法一
根据题目要求,我们可以通过两个列表来分别按序列号 number
的升序顺序存储优先乘客和非优先乘客的名单,最后先输出优先乘客再输出非优先乘客即可。
List<Person> preList = new ArrayList<>();
List<Person> aftList = new ArrayList<>();// 遍历list 对其中的Person对象逐一进行判断
for (Person p : list) {if (p.age < 5 || p.age > 60) {preList.add(p);} else {aftList.add(p);}
}
方法二
同样地,我们也可以通过链表来实现优先有序排列。具体链表的实现,我们可以用到Java提供的 LinkedList
类来解决。
// 新建一个链表 便于插入操作
LinkedList<Person> newList = new LinkedList<>();
按照题目所要求的,我们可以遍历列表中的所有乘客,如果该乘客符合条件,就将其插入到链表的前端;否则就插入到链表的后端。同时,我们也需要一个变量来记录符合条件的人数,以便后续插入新的符合条件的人。
// 用于存储符合条件的人数
int preCount = 0;
// 遍历list中的所有Person对象
for (Person p : list) {// 如果年龄符合优先条件if (p.age < 5 || p.age > 60) {// 如果链表为空if (newList.size() < 1) {// 将符合优先条件的放到第一个newList.addFirst(p);// 记录符合条件的人数preCount++;} else {// 在上一个符合条件的人后面插入newList.add(preCount, p);preCount++;}} else {// 如果年龄不符合条件// 则在链表末尾进行插入操作newList.addLast(p);}
}
最后,同 方法一
将 newList
中的 Person
对象遍历输出即可。
题解代码
方法一
Solution.java
import java.util.*;public class Solution {public void priority(List<Person> list) {// write your code hereList<Person> preList = new ArrayList<>();List<Person> aftList = new ArrayList<>();// 遍历list 对其中的Person对象逐一进行判断for (Person p : list) {if (p.age < 5 || p.age > 60) {preList.add(p);} else {aftList.add(p);}}for (Person p : preList) {System.out.println(p.toString());}for (Person p : aftList) {System.out.println(p.toString());}}}
方法二
Solution.java
import java.util.*;public class Solution {public void priority(List<Person> list) {// write your code here// 新建一个链表 便于插入操作LinkedList<Person> newList = new LinkedList<>();// 用于存储符合条件的人数int preCount = 0;// 遍历list中的所有Person对象for (Person p : list) {// 如果年龄符合优先条件if (p.age < 5 || p.age > 60) {// 如果链表为空if (newList.size() < 1) {// 将符合优先条件的放到第一个newList.addFirst(p);// 记录符合条件的人数preCount++;} else {// 在上一个符合条件的人后面插入newList.add(preCount, p);preCount++;}} else {// 如果年龄不符合条件// 则在链表末尾进行插入操作newList.addLast(p);}}for (Person p : newList) {System.out.println(p.toString());}}}
知识要点
1. 队列
队列是一种由数组和链表作为底层构造的只暴露头和尾操作API的数据结构。队列的特性是:先进先出。
2. 双端队列
双端队列(Deque)是Double Ended Queue的缩写,顾名思义就是队列的两个端口都能进出。
Deque的实现类是 LinkedList
,ArrayDeque
和 LinkedBlockingDeque
,其中 LinkedList
是最常用的。
大多数Deque既可以是有容量限制的,也可以是无固定容量限制。
双端队列的插入、删除和检查方法各有两种形式:
第一个元素 | (头部) | 最后一个元素 | (尾部) | |
---|---|---|---|---|
抛出异常 | 特殊值 | 抛出异常 | 特殊值 | |
插入 | addFirst(e) | offerFirst(e) | addLast(e) | offerLast(e) |
删除 | removeFirst() | pollFirst() | removeLast() | pollLast() |
检查 | getFirst() | peekFirst() | getLast() | peekLast() |
3. LinkedList实现Deque
LinkedList 是一个在双向队列基础上搭建的双向链表,其关键方法主要有:
- addFirst(E):在队头添加元素。
- addLast(E):在队尾添加元素。
- E removeFirst():删除队头元素。
- E removeLast():删除队尾元素。
这些方法都是通过操作成员变量 first 和 last 来实现的。first 和 last 的类型是私有类 Node<E>
。实现很简洁,Java 代码如下所示:
private static class Node<E> {E item;Node<E> next;Node<E> prev;Node(Node<E> prev, E element, Node<E> next) {this.item = element;this.next = next;this.prev = prev;}
}
构造方法中清晰体现了它们的初始化过程。这样就能很好地理解之前提及的四个方法是如何实现了。
比如,addLast(E)
,新建一个 Node 结点 n,数据域为方法形参,n.prev
设置为当前的 last,last.next
设置为 n,然后 last=n
,即可完成需求。其他方法的实现原理类似。
数组-链表--乘车按序就座相关推荐
- 乘车按序就座(List集合及定义排序规则)
描述 我们规定乘坐公共交通工具时,正常情况下乘客按序列号 number 的升序顺序排队就座,当乘客中有年龄 age 小于 5 岁(不含 5 岁)的幼儿乘客或是年龄 age 大于 60 岁(不含 60 ...
- C语言哈希表的简单实现——数组+链表(拉链法)
C语言哈希表的简单实现--数组+链表(拉链法) 1.哈希表简介 哈希表详细介绍可以参考这篇文章 2.哈希表拉链法实现 2.1完全由本人思路实现,如有错误,欢迎批评指正 哈希声明文件hash.h /* ...
- Java集合常见数据结构-栈/队列/数组/链表/红黑树
数组 链表 红黑树
- 【Java8】堆栈/队列/数组/链表/红黑树,List/set子接口,hashcode/hashset,Map/内部接口,/统计字符个数,debug,斗地主,Collections,TreeSet
文章目录 1.堆栈/队列/数组/链表:数据结构即计算机组织管理数据的方式,堆栈指的是内存图中的栈,不是堆 2.红黑树:二查,二查平,二查平1倍 3.List子接口:集合,IndexOutOfBound ...
- Java基础入门笔记-数组链表
数组链表ArrayList ArrayList是JDK自带的基础工具类. java.util.ArrayList 也是一个容器(里面存放对象) 1.添加对象add: 2.删除对象remove: 3.遍 ...
- 存数组元素的个数_HashMap1.8之后为什么要采用数组+链表+红黑树的储存方式?
HashMap概述 HashMap是基于Map接口实现的,采取(key,value)的储存方式.其中key和value可以为空,但是key不能重复.下面我们来详细解读一下HashMap的底层实现原理. ...
- leecode - 入门 -- 双指针秒杀数组/链表题目
目录 有序数组/链表去重 -- 快慢指针 移除元素 移动零 有序数组/链表去重 – 快慢指针 Leecode 26题 : 有序数组去重 快指针表示遍历数组到达的下标位置,慢指针表示下一个不同元素要填入 ...
- 基础的数组/链表实现的队列
上周我们学习了队列的实现,我们可以通过数组或者链表实现队列,队列是对数据的一种存储方式,但是它更优于数组和链表,下面是编写的简单的数组/链表对队列的实现,完善版的还没有完全搞好,先是最基础的实现类: ...
- 常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构)
常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构) 数据结构和算法作为程序员的基本功,一定得稳扎稳打的学习,我们常见的框架底层就是各类数据 ...
最新文章
- python基础(迭代器,生成器,装饰器)
- RecycleView中使用Glide加载图片防止加载错乱
- linux shell 字符串操作(长度,查找,替换)详解	BASH
- 2016年,这50家创业公司将真正改变世界
- 文件加密及解密openssl
- 竖流式沉淀池集水槽设计计算_竖流式沉淀池的设计
- 电脑硬件知识学习_31岁,还在熬夜学习到2点的背后,是一个丈夫和父亲的责任与担当...
- 高德地图——一款功能强大的APP
- C语言错题锦集(持续更新)
- 两种方法身份证读卡器对接,实现扫描身份证读取身份证信息功能。
- c语言程序如何编写选择题,c语言程序 如何编写挑选题
- 入门pandas—数据填充
- 关于DSP28335CCS6编译时出现error #10099-D: program will not fit into available memory.
- Hadoop的归档---har
- java校内报纸实验报告_第六周Java实验报告四
- 数据分析师,如何向亲友解释自己的工作
- Gallery与Imageswitch完美结合 做相册一绝啊
- SQL中的COALESCE()函数
- C语言经典问题——兑换硬币
- 安卓判断APP是在前台还是在后台
热门文章
- android 控制空调,基于Android的多功能空调控制系统设计
- 精彩的在线图表软件 - 真实体验的实时演示
- 016-前端学习-Html\CSS\制作带有二维码的门店订单小票
- rpm 安装jdk-6u45-linux-amd64.rpm发现需要依赖相关的库
- 计算机及应用报考监理工程师,计算机应用专业可以考监理工程师吗
- 【迁移学习】Agile Domain Adaptation——一种平衡运算资源和速度的深度迁移学习方法
- 21年更新版抓取小姐姐短视频教程!最关键的是无水印下载哦。这还学不会?
- 2022下半年全国大学英语四六级成绩今日可查
- 【视频资源】c语言全套高清视频打包下载,希望对正在学习c语言的朋友有帮助...
- 读《最受欢迎的图表简报术》(1)如何写计划书