首页 > 编程语言 >计挑-国赛-Java-题5

计挑-国赛-Java-题5

时间:2022-12-31 17:44:23浏览次数:48  
标签:Node 链表 Java get 国赛 next 计挑 索引 节点

测试用例1:
5
P1->P3
P2->P4
P4->P1
P3->P5
P1
输出1:
P2
3

测试用例2:
8
P3->P5
P5->P2
P4->P3
P2->P6
P1->P7
P6->P8
P8->P1
P6
输出2:
P4
5

没做出来,但是事后慢慢做出来了,所以是不熟练

很明显这是一个复合数据结构结构的设计题目

样子很像是组合出一条链表,但是涉及到几个问题:

  1. 拼接链表节点的时候,查找链表节点的问题,需要知道节点是否已经存在,存在了还要能获取到才能接
  2. 链表序列的排序问题,拼接过程中每个节点的索引号都是随时变化的,而且链表本身也不支持索引号访问以及根据节点查找索引
    那么
  3. 首先至少要有一个索引map,给每个节点新增一个索引号属性并维护,同时能够根据给出的字段名获取,那毫无疑问肯定是map合适
  4. 其次光能够获取索引号还不够,还要保存并获取节点本身,所以再来一个map

题外话,我觉得这里两个map可能是冗余了,但是按照目前的思路是必要的,除非换个思路

最后是打印头节点,我觉得我这里的处理并不优雅,遍历索引map找索引号为1

一开始是打算用一个变量维护头节点的,但是发现这样做似乎并不能保证正确性

以下是本人代码,复合了两个map和单向链表:

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Main {
    /**
     * key是字符,value是索引位置,主要用来排序,用来给链表排序并查询每个节点的排序位置
     */
    private static final Map<String, Integer> findNodeIndexMap = new HashMap<>();
    /**
     * key是字符,value是节点,用来方便获取节点,因为链表每次获取节点都需要遍历
     * 用来检查节点是否存在
     */
    private static final Map<String, Node> findNodeMap = new HashMap<>();

    /**
     * 链表节点定义
     */
    static class Node {
        Node next = null;
        String name;
        public Node(String name) {
            this.name = name;
        }
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        sc.nextLine();// 吞掉一行空行
        for (int i = 0; i < n - 1; i++) {
            String str = sc.nextLine();
            String pre = str.substring(0, 2);
            String next = str.substring(4);

            if (findNodeMap.get(pre) == null) {
                /*
                后节点空不空都要新建一个前节点
                 */
                Node newPreNode = new Node(pre);
                findNodeMap.put(pre,newPreNode);
                findNodeIndexMap.put(pre,1);
                if (findNodeMap.get(next) == null) {
                    /*
                    如果两个节点都不存在,就新建这两个节点并加入到map中
                     */
                    Node nodeNext = new Node(next);
                    newPreNode.next = nodeNext;
                    findNodeIndexMap.put(nodeNext.name, 2);
                    findNodeMap.put(nodeNext.name, nodeNext);
                } else {
                    /*
                    前节点空但是后节点不空,就要在前面追加一个新节点
                     */
                    newPreNode.next = findNodeMap.get(next);
                    addIndex(newPreNode);
                }
            } else {
                /*
                前节点存在,修改后节点指针,不存在就new一个
                 */
                Node node = findNodeMap.get(pre);
                Node nextNode;
                if (findNodeIndexMap.get(next) != null)
                    nextNode = findNodeMap.get(next);
                else {
                    nextNode = new Node(next);
                    findNodeMap.put(next, nextNode);
                    findNodeIndexMap.put(next, 1);
                }
                node.next = nextNode;
                addIndex(node);
            }
        }
        // 遍历map找到索引为1的头节点
        findNodeIndexMap.forEach((k,v)-> {
            if(v==1) System.out.println(k);
        });
        /*
        查找指定节点的索引号
         */
        String get = sc.nextLine();
        System.out.println(findNodeIndexMap.get(get));
    }

    /**
     * 追加更新node后面所有的节点索引
     */
    private static void addIndex(Node node) {
        int startIndex = findNodeIndexMap.get(node.name);
        while (node.next != null) {
            node = node.next;// 更新链表节点指针
            findNodeIndexMap.put(node.name, ++startIndex);// 更新节点的索引号
        }
    }
}

标签:Node,链表,Java,get,国赛,next,计挑,索引,节点
From: https://www.cnblogs.com/yaocy/p/17017038.html

相关文章

  • java开发社区活动预约系统
    简介本系统主要是社区活动预约系统网站,社区管理员可以发布活动,社区居民和游客均可进行活动预约,管理员后台审核预约是否通过,居民可以填写活动感受,管理员查看感受后可以进行......
  • java开发机动车考试驾照考试-科一科四考试在线题库系统
    简介本系统主要是进行科一科四考试和练习的网上考试系统,分为A1B1、A2B2、C1C2的科一科四考试系统,当学员点击开始考试,系统将自动生成随机题目100道(选择题80道,判断题20道)的......
  • java开发的医院体检预约系统
    简介体检项目预约网站,普通用户注册登录可以网上预约体检项目,经过后台人员审核后可以去体检。用户还可以记录自己的身体指标下载体检报个,查看医嘱等。医院后台可以进行权限......
  • java开发的美妆化妆品电商商城系统
    简介Java基于ssm(可以转springboot项目哦)开发的美妆商城系统,主要是卖化妆品的系统,用户可以浏览商品,加入购物车,下单,在个人中心管理自己的订单。管理员可以管理自己的商品,......
  • Java财务在线咨询网站系统财务咨询网
    简介财务咨询网站,可以咨询公司代办,代理记账等一系列的财务问题的资讯服务网站演示视频https://www.bilibili.com/video/BV1T54y1H7Ar/?share_source=copy_web&vd_source......
  • java不常用的api
    集合转换成数组--打印数组LinkedList<String>linkedList=newLinkedList<>();linkedList.add("京");linkedList.add("津");linkedList.add("黑");String[]array=link......
  • 搭建web自动化环境,selenium-Java+火狐浏览器+idea
    1、准备浏览器,火狐/谷歌等2、下载驱动插件火狐插件链接:https://github.com/mozilla/geckodriver/releases谷歌插件:https://registry.npmmirror.com/binary.html?path=ch......
  • 9.Java异步编程
    一.JavaExecutor框架 Runnable接口和Callable接口都是对任务的抽象。java.util.concurrent.Executor接口则是对任务执行的抽象。 Executor接口功能有限,①只能为客户端......
  • How to Iterate HashMap in Java?
    https://www.geeksforgeeks.org/how-to-iterate-hashmap-in-java/ HashMap isapartofJava’scollectionprovidingthebasicimplementationoftheMapinterfa......
  • JAVA零基础小白上手教程day08-JAVAOOP面向对象
    day08-JAVAOOP课程目标1.【理解】什么是接口2.【掌握】接口的定义格式3.【掌握】接口的使用4.【理解】接口的成员特点5.【理解】类和接口抽象类和接口之间的关......