【编程马拉松】【022-网页浏览历史】
2016-07-06 07:40
274 查看
【编程马拉松算法目录】
【022-网页浏览历史】【工程下载>>>】
1 题目描述
标准的网页浏览器都提供一个功能:保留最近浏览过页面的历史记录。通过后退或向前按钮就能在历史记录之间跳转。现在,请你模拟这个功能,接收如下三条指令:
1. BACK:回退功能,即回退到上一个访问的页面;
2. FORWARD:使用BACK返回上一页之后,可以使用FORWARD回到下一页;
3. VISIT url:访问指定url的页面,并且所有FORWARD的页面都被清空。
1.1 输入描述:
输入包含多组数据,每组数据第一行包含一个正整数n(1≤n≤100)。紧接着有n行,每一行包含一条指令。其中url是不包含空格、长度不超过100的非空字符串。
1.2 输出描述:
对应每组数据,为每条指令输出当前页面的URL。如果当前指令无效(例如没有上一页时执行BACK指令、或没有下一页时执行FORWARD指令),则输出一行“ignore”。
每组数据之后输出一个空行作为分隔。
1.3 输入例子:
13 VISIT http://www.acm.org/ VISIT http://acm.ashland.edu/ VISIT http://acm.baylor.edu/acmicpc/ BACK BACK BACK FORWARD VISIT http://www.ibm.com/ BACK BACK FORWARD FORWARD FORWARD
1.4 输出例子:
http://www.acm.org/ http://acm.ashland.edu/ http://acm.baylor.edu/acmicpc/ http://acm.ashland.edu/ http://www.acm.org/ ignore http://acm.ashland.edu/ http://www.ibm.com/ http://acm.ashland.edu/ http://www.acm.org/ http://acm.ashland.edu/ http://www.ibm.com/ ignore
2 解题思路
题目比较简单见代码注释。3 算法实现
import java.util.ArrayList; import java.util.List; import java.util.Scanner; /** * Author: 王俊超 * Time: 2016-05-13 10:32 * CSDN: http://blog.csdn.net/derrantcm * Github: https://github.com/Wang-Jun-Chao * Declaration: All Rights Reserved !!! */ public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // Scanner scanner = new Scanner(Main.class.getClassLoader().getResourceAsStream("data.txt")); while (scanner.hasNext()) { int n = scanner.nextInt(); List<String> visit = new ArrayList<>(n); for (int i = 0; i < n; i++) { String s = scanner.next(); visit.add(s); // 如果是访问页面就再读取访问的页面RUL if ("VISIT".equals(s)) { visit.add(scanner.next()); } } List<String> result = history(visit); for (String url : result) { System.out.println(url); } System.out.println(); } scanner.close(); } /** * 记录浏览历史 * * @param visit 访问序列,为VISIT、BACK和FORWARD。如果是VISIT后面会一个就是直接访问的RUL * @return 访问的页面URL */ private static List<String> history(List<String> visit) { List<String> result = new ArrayList<>(); // 记录访问的历史页面 List<String> history = new ArrayList<>(visit.size()); // 记录上一个访问的页面位置 int prev = -1; for (int i = 0, j = visit.size(); i < j; i++) { String act = visit.get(i); if ("VISIT".equals(act)) { // 取URL i++; String url = visit.get(i); // 移除上一个页面的所有FROWARD页面 while (history.size() > prev + 1) { history.remove(history.size() - 1); } prev++; history.add(url); result.add(history.get(prev)); } else if ("BACK".equals(act)) { if (prev <= 0) { result.add("ignore"); } else { prev--; result.add(history.get(prev)); } } else if ("FORWARD".equals(act)) { if (prev + 1 >= history.size()) { result.add("ignore"); } else { prev++; result.add(history.get(prev)); } } } return result; } }
4 测试结果
5 其它信息
因为markddow不好编辑,因此将文档的图片上传以供阅读。Pdf和Word文档可以在Github上进行【下载>>>】。相关文章推荐
- 8.3 C语言函数的形参和实参
- 8.2 C语言函数的调用
- 7.2 C语言变量的存储类别
- Java反射机制(创建Class对象的三种方式)
- 7.1 C语言变量的作用域
- C# Refactorings VS插件
- 学习ASP.NET Core,你必须了解无处不在的“依赖注入”
- 封装JavaBean对象
- C++学习指南
- leetcode-100. Same Tree c++
- Java中线程入门
- 进程间通信:消息队列(代码实现)
- 函数指针的特殊性, 定义和调用都有两种做法
- Struts2系列:(31)modelDriven
- read obj in matlab
- 关键字
- How do I divide matrix elements by column sums in MATLAB?
- Struts2拦截器原理简介
- JavaEE学习笔记之SSH—Hibernate(4)
- collections