Map练习题:求地铁票价
题目:
【1】将以下车站对应关系的数据存储到map集合中, key:表示站编号,value:表示站名,遍历并打印(可以不按顺序)
站编号和站名对应关系如下: 1 朱辛庄 2 育知路 3 平西府 4 回龙观东大街 5 霍营 6 育新 7 西小口 8 永泰庄 9 林萃桥 10 森林公园南门 11 奥林匹克公园 12 奥体中心 13 北土城 14 安华桥 15 安德里北街 16 鼓楼大街 17 什刹海 18 南锣鼓巷 19 中国美术馆
【2】计算地铁票价规则: 总行程 3站内(包含3站)收费3元, 3站以上但不超过5站(包含5站)的收费4元, 5站以上的,在4元的基础上,每多1站增加2元, 10元封顶;
需要对键盘录入的上车站 和到达站进行判断,如果没有该站, 提示重新输入,直到站名存在为止 每站需要2分钟
示范如下:
请输入上车站: 流沙河
您输入的上车站:流沙河站不存在,请重新输入上车站: 骑龙 您输入的上车站:骑龙站不存在,请重新输入上车站: 朱辛庄 您以确定在朱辛庄上站! 请输入到达站: 沙河 您输入的到达站:沙河站不存在,请重新输入到达站: 西二旗您输入的到达站:西二旗站不存在,请重新输入到达站: 西小口 您以确定在朱辛庄下站!从朱辛庄到西小口共经过6站收费6元,大约需要12分钟
第一小题很简单,就是创建Map集合,把数据添加进去,再遍历就可
我们主要来看看第二小题,我按照我思考的方式写下了下面代码:
我的思路:获取输入的上车站,遍历集合hm里的值,如果相等就获取到达站(不等就给出提示并继续获取),遍历集合hm里的值,与输入的到达站比较,相等就再来个循环遍历hm里的键,找到上车站对应的键,然后再来个循环遍历hm里的键,找到到达站对应的键,根据键来计算所需时间和所需花费的钱.......
System.out.println("请输入上车站:");boolean flag = true;while(flag){Scanner sc = new Scanner(System.in);String start = sc.nextLine();Collection<String> values = hm.values();for(String v : values){if(v.equals(start)){System.out.println("您已确定在" + start +"上站!");System.out.println("⬇");System.out.println("请输入到达站:");while(flag) {String end = sc.nextLine();if (v.equals(end)) {System.out.println("您已确认在" + end + "下站!");Set<Integer> keySet = hm.keySet();for (int startNum : keySet) {if (hm.get(startNum).equals(start)) {for (int endNum : keySet) {if (hm.get(endNum).equals(end)) {int number = Math.abs(endNum - startNum);//经过站数量int allFree = 0;if (number <= 3) {allFree = 3;} else if (number <= 5) {allFree = 4;} else {allFree = 4 + (number - 5) * 2;if (allFree > 10) {allFree = 10;}}System.out.println("从" + start + "到" + end + "共经过" + number + "站收费" + allFree + "元,大约需要" + (number * 2) + "分钟");break;}}}break;}} else {System.out.println("⬇");System.out.println("您输入的到达站:" + end + "不存在,请重新输入到达站:");flag = true;break;}}}else {System.out.println("⬇");System.out.println("您输入的上车站:" + start + "不存在,请重新输入上车站:");flag = true;break;}}}
思路并没什么问题,但这代码就挺大问题的!!!学了数据结构后,我知道一个算法的时间复杂度与循环次数有紧密关系,而我这代码 用了五个循环!!!而且运行也是有问题的,下面是修改版本:
不需要遍历values集合,直接使用containsValue()方法,判断该站点是否存在集合即可(减少了两个循环)
System.out.println("请输入上车站:");while (true) {Scanner sc = new Scanner(System.in);String start = sc.nextLine();//Collection<String> values = hm.values();//for(String v : values){//不需要遍历values集合,直接使用containsValue()方法,判断该站点是否存在集合即可if (hm.containsValue(start)) {System.out.println("您已确定在" + start + "上站!");System.out.println("⬇");System.out.println("请输入到达站:");while (true) {String end = sc.nextLine();//不需要遍历values集合,直接使用containsValue()方法,判断该站点是否存在集合即可if (hm.containsValue(end)) {System.out.println("您已确认在" + end + "下站!");Set<Integer> keySet = hm.keySet();int startNum = 0;int endNum = 0;for (int num : keySet) {if (hm.get(num).equals(start)) {startNum = num;}// for (int endNum : keySet) {if (hm.get(num).equals(end)) {endNum = num;}}int number = Math.abs(endNum - startNum);//经过站数量int allFree;if (number <= 3) {allFree = 3;} else if (number <= 5) {allFree = 4;} else {allFree = 4 + (number - 5) * 2;if (allFree > 10) {allFree = 10;}}System.out.println("从" + start + "到" + end + "共经过" + number + "站收费" + allFree + "元,大约需要" + (number * 2) + "分钟");break;} else {System.out.println("⬇");System.out.println("您输入的到达站:" + end + "不存在,请重新输入到达站:");//flag = true;}}} else {System.out.println("⬇");System.out.println("您输入的上车站:" + start + "不存在,请重新输入上车站:");//flag = true;}}
下面再来一个进阶版,从问题的答案出发,找需要用到量,再将它们分块求出来再凑在一起求出答案。
Scanner sc = new Scanner(System.in);String sStart;//上车站String sEnd;//到达站//获取上车站System.out.println("请输入上车站:");while (true){sStart = sc.next();if(hm.containsValue(sStart)){System.out.println("您已确定在" + sStart +"上站!");System.out.println("⬇");break;}else {System.out.println("⬇");System.out.println("您输入的上车站:" + sStart + "不存在,请重新输入上车站:");}}//获取到达站System.out.println("请输入到达站:");while (true){sEnd = sc.next();if(hm.containsValue(sEnd)){System.out.println("您已确认在" + sEnd + "下站!");break;}else {System.out.println("⬇");System.out.println("您输入到达站:" + sEnd + "不存在,请重新输入到达站:");}}//获取站点编号及间隔差int iStart = 0;int iEnd = 0;int iSub = 0;Set<Integer> keySet = hm.keySet();for(Integer i : keySet){if(hm.get(i).equals(sStart)){iStart = i ;}if(hm.get(i).equals(sEnd)){iEnd = i;}}if(iStart > iEnd){//iSub = 19 - iEnd + iStart;//因为地铁有往返两趟,所以直接求两站间的站数即可(或用Math.abs()求绝对值iSub = iStart - iEnd;} else {iSub = iEnd - iStart;}//计算金额int price = 0;if(iSub <= 3){price = 3;}else if(iSub <= 5){price = 4;}else {price = 4 + (iSub - 5)*2;}price = price > 10 ? 10 : price;//计算时间int time = iSub * 2;System.out.println("从" + sStart + "到" + sEnd + "共经过" + iSub + "站收费" + price + "元,大约需要" + time + "分钟");
这样就比较清晰明了了**,拜拜~
Map练习题:求地铁票价相关推荐
- java 地铁费_Java练习题_Map集合,遍历车站编号及名称、计算地铁票价。
[1]将以下车站对应关系的数据存储到map集合中, key:表示站编号,value:表示站名, 并遍历打印(可以不按顺序打印): [2]计算地铁票价规则: 总行程 3站内(包含3站)收费3元, 3站以 ...
- 大学地铁购票计算金额java_Java练习题_Map集合,遍历车站编号及名称、计算地铁票价。...
[1]将以下车站对应关系的数据存储到map集合中, key:表示站编号,value:表示站名, 并遍历打印(可以不按顺序打印): [2]计算地铁票价规则: 总行程 3站内(包含3站)收费3元, 3站以 ...
- 设计模式之策略模式在地铁票价系统中的应用
引言 设计模式是面向对象编程的一个非常精彩的部分.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性,它能帮助我们将应用组织成容易了解,容易维护,具有弹性的架构.本文通过一个简单的案 ...
- 编程帮助小明计算地铁票价(C++)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 题目: 北京地铁票价发生了变化,现在新的计算规则如下:6公里内3元(包括6公里). 6-12公里4元(不包括6公里,包括12公里). ...
- 题目 - 北京地铁 描述 北京地铁涨价了,现在的地铁票价计算方法如下: 6公里内 3元 (包括6公里) 6-12 公里 4元 (不包括6公里,包括12公里) 12-32 公里 每10公里加1元
题目 - 北京地铁 描述 北京地铁涨价了,现在的地铁票价计算方法如下: 6公里内 3元 (包括6公里) 6-12 公里 4元 (不包括6公里,包括12公里) 12-32 公里 每10公里加1元(不包括 ...
- java 地铁费_通过java程序模拟实现地铁票价2+2=12
地铁票价在这周六开始就要上涨了,这几天做地铁明显感觉人比平常多了很多.大家也都在默默的等待这一刻的到来,尽管很不情愿,但是终究会来. 到时候肯定吐槽的人一抓一大把,毕竟一天上班4块的时代就要终结,一下 ...
- 通过java程序模拟实现地铁票价2+2=12(r3笔记第94天)
地铁票价在这周六开始就要上涨了,这几天做地铁明显感觉人比平常多了很多.大家也都在默默的等待这一刻的到来,尽管很不情愿,但是终究会来. 我们先来看一个简单的例子. ticket_fee1=2; tick ...
- linux写一个10的阶乘,C语言练习题:求1到10的阶乘之和简单实例
C语言练习题:求1到10的阶乘之和简单实例 C语言练习题:求1到10的阶乘之和简单实例 #include int factorial(int n) { if(0==n) return 1; if(1= ...
- POJ 4113:北京地铁票价-BeiJing Subway
做一道水题欢乐一下. 总时间限制: 1000ms 内存限制: 65536kB 描述 从2014年12月28日起,北京市公交地铁将执行新的票价方案.其中地铁的票价方案改为:6公里(含)内3元:6公里至1 ...
最新文章
- 10个有趣的javascript和css库(2019年5月最新)
- 第一章 Mysql 简介及安装和配置
- java实现收货7天发通知,Java实训的第7天
- 把一个dataset的表放在另一个dataset里面_视频自监督一. STCR: 一个基于数据增强的简单有效正则项 (降低静态信息的影响)...
- LCD1602液晶显示模块的单片机驱动深入详解之硬件篇
- 《Netkiller Spring Cloud 手札》之 Master / Slave 主从数据库数据源配置
- h3c s7506e 配置手册_H3C交换机s5500Web登录配置
- MYSQL 学习笔记记录整理之三:子查询
- python学习笔记2018-9-18
- python渲染html页面_在Python中使用CasperJS获取JS渲染生成的HTML内容的教
- springboot+vue汽车4S店车辆销售维修管理系统java源码
- 软素质面试题分享以及一些面试技巧和面试礼仪
- 服务器版“永恒之蓝”高危预警 (Samba远程命令执行漏洞CVE-2017-7494) 攻击演示...
- linux启动过程文件系统崩溃,Linux启动过程中文件系统的加载
- 20位大佬,勾勒出一个中国网络安全江湖
- 小灰的基金,总算是回血一波。。。
- 汉字转换为拼音的JavaScript库
- LC72 Edit Distance
- 人工智能中的Web端编程
- Cisco Packet Tracer的DHCP
热门文章
- python 求两线段是否相交,如果相交求交点
- C语言的 restrict 关键字的作用
- 三次样条插值(Spline插值)
- android程序字体大小,Android如何动态调整应用字体大小详解
- orb-slam系列 LoopClosing线程 DetectLoop(十)
- 狂肝半个月-嵌入式开发学习学习路线+知识汇总
- Xcode The 'Apple Push Notification' feature is only available to users enrolled in Apple Develo...
- cmd进入指定目录方法
- JAVA梅森旋转随机算法_梅森旋转算法
- 计算机浮点数的格式,单精度与双精度的区别