還是算法作業之一,這次其實是一個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,還要記得flag和rear指針移動到最後一個元素上;處於中間/頭結點時要引入一個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;
}
}
}
}
}
對你有幫助的話就點個小贊吧,有什麼意見也可以多評論。
最後吉祥物鎮樓