日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

(链表,插入元素)破损的键盘

發布時間:2025/3/12 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (链表,插入元素)破损的键盘 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目:

你有一個破損的鍵盤。鍵盤上的所有鍵都可以正常工作,但有時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

分析與解答:

這題怎么說呢,劉汝佳一上來就把鏈表的核心拋出來了,我足足看了兩個小時才理解,不過利用數組表示單鏈表也掌握了
0.為了方便起見,常常在鏈表第一個元素之前放一個虛擬節點s[0]
1.光標cur,最后一個字符編號last,其實只是由于這題home,end的條件限制
如果用數組建立單鏈表,只需要next[i]和s[i]
2.其中next[i]是s[i]連的下一個字符的編號,比如:
s[0],next[0]=3連下一個字符->
s[next[0]],next[next[0]]
3.在本題中,如果next[i]=0,說明不知道這個節點連哪個下一個節點,如果全部插入完節點,遇到next[i]=0,就意味著這個鏈表已經結束
所以有如下對鏈表遍歷的方法:

for(int i=next[0];i!=0;i=next[i])printf("%c",s[i]);

4.下面說說怎么插入
s[i]對應一個next[i],那么s[i]下一個連的是s[next[i]],next[next[i]]
如果在s[i]后面插入s[j]next[j]
只需next[j]=next[i],next[i]=j
新節點j先插到后面next[i]的前面,再把前面i的后面連的那個節點改為新插入的那個j
5.再來說說本題
a.只需改變s的輸出順序,輸出s[next[i]]
b.多了個[],就是說插入的位置會發生變化,怎么辦?
光標派上用場,
先看一般情況:s[0]0a1b2c3,注意光標的意思,假設光標一開始是0,你輸入a,那1就是此時光標的位置,假設s[1]=a,那我們還沒遍歷到b的時候,next[1]=0(看不懂得話看上面的黑色重點字體),next[0]=1,這是在s[0]后面插入s[1],(看不懂的話看重新看上面的4),此時如果光標等于最后一個字符的編號(比如last,cur初始值是0,那么你加了一個字符,最后一個字符編號自然需要更新)就更新最后一個字符編號,然后把光標改成1
再看特殊的:
如果碰見[,光標跑到0了,把cur改成0
碰見],光標跑到最后一個了數的后面了,你們發現了嗎,最后一個數的下標正好是光標的下標,所以cur=last
6.悟道是acmer的必經之路,多看幾個小時,就明白了

#include <cstdio> #include <cstring> const int maxn=100000+5; int last,cur,next[maxn]; char s[maxn];int main(){while(scanf("%s",s+1)){int n=strlen(s+1);last=cur=0; next[0]=0; for(int i=1;i<=n;i++){char ch=s[i];if(ch=='[') cur=0; else if(ch==']') cur=last; else{ next[i]=next[cur]; next[cur]=i; if(cur==last) last=i; cur=i; }}for(int i=next[0];i!=0;i=next[i])printf("%c",s[i]);printf("\n");}return 0; }

總結

以上是生活随笔為你收集整理的(链表,插入元素)破损的键盘的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。