破損的鍵盤(悲劇的文本)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;
                }

            }
        }

    }

}

對你有幫助的話就點個小贊吧,有什麼意見也可以多評論。

最後吉祥物鎮樓
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章