描述

我们规定乘坐公共交通工具时,正常情况下乘客按序列号 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

解题思路

题目要求:

  1. 乘客年龄 age 小于5岁或是大于60岁的乘客,优先按序就座
  2. 乘客需要按序列号 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 ,即可完成需求。其他方法的实现原理类似。

数组-链表--乘车按序就座相关推荐

  1. 乘车按序就座(List集合及定义排序规则)

    描述 我们规定乘坐公共交通工具时,正常情况下乘客按序列号 number 的升序顺序排队就座,当乘客中有年龄 age 小于 5 岁(不含 5 岁)的幼儿乘客或是年龄 age 大于 60 岁(不含 60 ...

  2. C语言哈希表的简单实现——数组+链表(拉链法)

    C语言哈希表的简单实现--数组+链表(拉链法) 1.哈希表简介 哈希表详细介绍可以参考这篇文章 2.哈希表拉链法实现 2.1完全由本人思路实现,如有错误,欢迎批评指正 哈希声明文件hash.h /* ...

  3. Java集合常见数据结构-栈/队列/数组/链表/红黑树

    数组 链表 红黑树

  4. 【Java8】堆栈/队列/数组/链表/红黑树,List/set子接口,hashcode/hashset,Map/内部接口,/统计字符个数,debug,斗地主,Collections,TreeSet

    文章目录 1.堆栈/队列/数组/链表:数据结构即计算机组织管理数据的方式,堆栈指的是内存图中的栈,不是堆 2.红黑树:二查,二查平,二查平1倍 3.List子接口:集合,IndexOutOfBound ...

  5. Java基础入门笔记-数组链表

    数组链表ArrayList ArrayList是JDK自带的基础工具类. java.util.ArrayList 也是一个容器(里面存放对象) 1.添加对象add: 2.删除对象remove: 3.遍 ...

  6. 存数组元素的个数_HashMap1.8之后为什么要采用数组+链表+红黑树的储存方式?

    HashMap概述 HashMap是基于Map接口实现的,采取(key,value)的储存方式.其中key和value可以为空,但是key不能重复.下面我们来详细解读一下HashMap的底层实现原理. ...

  7. leecode - 入门 -- 双指针秒杀数组/链表题目

    目录 有序数组/链表去重 -- 快慢指针 移除元素 移动零 有序数组/链表去重 – 快慢指针 Leecode 26题 : 有序数组去重 快指针表示遍历数组到达的下标位置,慢指针表示下一个不同元素要填入 ...

  8. 基础的数组/链表实现的队列

    上周我们学习了队列的实现,我们可以通过数组或者链表实现队列,队列是对数据的一种存储方式,但是它更优于数组和链表,下面是编写的简单的数组/链表对队列的实现,完善版的还没有完全搞好,先是最基础的实现类: ...

  9. 常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构)

    常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构) 数据结构和算法作为程序员的基本功,一定得稳扎稳打的学习,我们常见的框架底层就是各类数据 ...

最新文章

  1. python基础(迭代器,生成器,装饰器)
  2. RecycleView中使用Glide加载图片防止加载错乱
  3. linux shell 字符串操作(长度,查找,替换)详解 BASH
  4. 2016年,这50家创业公司将真正改变世界
  5. 文件加密及解密openssl
  6. 竖流式沉淀池集水槽设计计算_竖流式沉淀池的设计
  7. 电脑硬件知识学习_31岁,还在熬夜学习到2点的背后,是一个丈夫和父亲的责任与担当...
  8. 高德地图——一款功能强大的APP
  9. C语言错题锦集(持续更新)
  10. 两种方法身份证读卡器对接,实现扫描身份证读取身份证信息功能。
  11. c语言程序如何编写选择题,c语言程序 如何编写挑选题
  12. 入门pandas—数据填充
  13. 关于DSP28335CCS6编译时出现error #10099-D: program will not fit into available memory.
  14. Hadoop的归档---har
  15. java校内报纸实验报告_第六周Java实验报告四
  16. 数据分析师,如何向亲友解释自己的工作
  17. Gallery与Imageswitch完美结合 做相册一绝啊
  18. SQL中的COALESCE()函数
  19. C语言经典问题——兑换硬币
  20. 安卓判断APP是在前台还是在后台

热门文章

  1. android 控制空调,基于Android的多功能空调控制系统设计
  2. 精彩的在线图表软件 - 真实体验的实时演示
  3. 016-前端学习-Html\CSS\制作带有二维码的门店订单小票
  4. rpm 安装jdk-6u45-linux-amd64.rpm发现需要依赖相关的库
  5. 计算机及应用报考监理工程师,计算机应用专业可以考监理工程师吗
  6. 【迁移学习】Agile Domain Adaptation——一种平衡运算资源和速度的深度迁移学习方法
  7. 21年更新版抓取小姐姐短视频教程!最关键的是无水印下载哦。这还学不会?
  8. 2022下半年全国大学英语四六级成绩今日可查
  9. 【视频资源】c语言全套高清视频打包下载,希望对正在学习c语言的朋友有帮助...
  10. 读《最受欢迎的图表简报术》(1)如何写计划书