一つのアルゴリズムや仕事が、これは実際にACMのタイトルです。オンラインビット、番号検索UVa11988を。直接質問に騒ぎ、。
タイトル
あなたは壊れたキーボードを持っていますか。キーボード上のすべてのキーが正常に動作しますが、時々、ホームボタンまたはEndキーに自動的にされます。あなたはこの問題キーボードの存在を知らないのではなく、原稿を演奏に集中することもモニターの電源を入れませんでした。あなたがあなたの前に表示するために、モニターの電源をオンにすると、それは悲劇のテキストでした。あなたの仕事は、ディスプレイを開く前に、この悲劇のテキストを計算することです。
入力データの複数のセットを含みます。これ以上100,000文字、下線文字「[」や「]を含ん行あたりのデータの各セット。」どの文字で「[」Homeキーを示し、「]」Endキーを表します。ファイルの終わり(EOF)のために終了マークを入力します。5メガバイトを超えていないファイルを入力します。各試験、出力ライン、画面上すなわち悲劇的なテキストの。
入力:
This_is_a_ [Beiju] _TEXT
[] [] [] Happy_Birthday_to_Tsinghua_University
出力:
BeijuThis_is_a_text
Happy_Birthday_to_Tsinghua_University
分析
ホームキーとEndキー、カーソルは、我々は文字を書き続けることから、移動するための移動、上常にあるために。データ構造では、インサートに提示されています。
挿入操作を行うためのアレイ不便、かかる可動要素毎時間。挿入に適しリスト、彼らはリンクリスト構造を使用して(ここではリスト理由を説明しませため、加えて、使用が実際にリンクされたリストやデータであるかどうかは、リストのアイデアを組み合わせることができ、ここに私のリストです)
ヘッドとテールポインタと配列着信話法、満たさ「[」または「]」は、それがヘッド又は後フラグに直接移動し、その後、継続されます。
それ以外の場合は、でフラグが判定されるテール・ノードまたはで中間体/第一ノード、通常アドオンの端にあるノードだけでなく、覚えフラグとリア最後の要素へのポインタと、に中間/最初のノードを導入する場合TMPは、実行するための新しいノードを追加し、その後、通常の挿入操作を行うフラグポイント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;
}
}
}
}
}
あなたは少し賞賛にそれを指している場合、あなたのためにヘルプがあり、どのようなアドバイスをコメントすることができます。
最後のタウンハウスをマスコット