破损的键盘(悲剧的文本)Java UVa11988

破损的键盘(悲剧的文本)Java UVa11988

还是算法作业之一,这次其实是一个acm题。网上查了一下,编号是UVa11988。废话不多说,直接上题。

题目

你有一个破损的键盘。键盘上所有的键都可以正常工作,但有时候Home键或者End键会自动按下。你并不知道键盘存在这一问题,而是专心打稿子,甚至连显示器都没打开。当你打开显示器后,展现在你面前的是一段悲剧文本。你的任务是在打开显示器之前计算出这段悲剧文本。

输入包含多组数据。每组数据占一行,包含不超过100000个字母、下划线、字符“[”或者“]”。其中字符“[”表示Home键,“]”表示End键。输入结束标志为文件结束符(EOF)。输入文件不超过5MB。对于每组数据,输出一行,即屏幕上的悲剧文本。

输入:
This_is_a_[Beiju]_text

[[]][][]Happy_Birthday_to_Tsinghua_University

输出:
BeijuThis_is_a_text

Happy_Birthday_to_Tsinghua_University

分析

因为Home和End键的缘故,光标在不断移动,移动到哪里就要从那继续写字符。在数据结构里呈现的就是插入操作了。

数组不方便做插入操作,每次移动元素耗费时间。而链表适合做插入操作,因此便用链表结构(为什么链表适合不在这里解释;另外无论是采用真的链表还是数据结合链表思想都可以,我这里用的是链表)

讲数组和头尾指针传入方法,遇见 ‘[’ 或 ‘]’,就直接移动flag到head或rear,然后continue。

否则就判断flag是在尾结点还是在中间/头结点上,处于尾结点就正常add,还要记得flagrear指针移动到最后一个元素上;处于中间/头结点时要引入一个tmp,来做添加的新结点,做正常的插入操作,然后flag指向tmp。

Java代码

import java.io.BufferedInputStream;
import java.util.Scanner;

/**
 * @ClassName BrokenKeyboard
 * @Description 悲剧的文本
 * @author 滑技工厂 https://blog.csdn.net/qq_41718454
 * @date 2020/3/7
 * @version 1.0
 */
public class BrokenKeyboard {

    public static void main(String[] args) {
        Scanner sc = new Scanner(new BufferedInputStream(System.in));
        String s = sc.nextLine();
        char[] chars = s.toCharArray();
        Node node = new Node();
        Node rear = node;
        node.create(node,rear,chars);
        node.print(node);
    }


    static class Node {
        char data;
        Node next;
        public Node() {
        }

        public Node(char data, Node next) {
            this.data = data;
            this.next = next;
        }
        public void print(Node node) {

            while (node != null) {
                if (node.data != 0)
                    System.out.print(node.data);
                node = node.next;
            }

        }
        /*
         * @Title create
         * @Description create方法,遇见'['从头指针插入,遇见']'从尾指针插入
         * @author 滑技工厂
         * @Date 2020/3/7
         * @param [head, a]
         * @return void
         * @throws
         */
        public void create(Node head, Node rear, char a[]) {
            //指针开始等于头结点
            Node flag = head;
            for (int i = 0; i < a.length; i++) {

                if (a[i] == '[') {
                    //[ 指针移到头结点
                    flag = head;
                    continue;
                } else if (a[i] == ']') {
                    //指针移到尾结点
                    flag = rear;
                    continue;
                }

                if (flag.next == null) {//flag=rear 在尾结点
                    flag.next = new Node(a[i], null);
                    flag = flag.next;
                    //保证rear始终在尾结点
                    rear = flag;
                } else {//不在尾结点,头结点还是中间结点都一样,next有值

                    Node tmp = new Node(a[i], flag.next);
                    flag.next = tmp;
                    flag = tmp;
                }

            }
        }

    }

}

对你有帮助的话就点个小赞吧,有什么意见也可以多评论。

最后吉祥物镇楼
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值