切換
舊版
前往
大廳
主題

ZeroJudge - e307: 請讓我留在你的回憶裡 解題心得

Not In My Back Yard | 2019-07-29 23:08:57 | 巴幣 4 | 人氣 414

題目連結:


題目大意:
輸入只有一列,給定一個字串 s (|s| ≦ 10 ^ 8,並包含所有可列印字元(不包含換行字元))。請將把其中連續的空白字元清掉並輸出。

清除方式為:連續空白個數若為偶數,則全清;若為奇數,則留一個空白。

時限:由於測資點一跟測資點二是一樣的,因此取時限為 0.2 s



範例輸入:
  M    y       n  am    e   i        s           S    a    c  h      i    .  


範例輸出:
My name is Sachi.


解題思維:
基本思想是:
快速掠過連續的空白 → 用串流的指標位置計算跳過了多少空白 → 把接著的東西輸入到字元陣列裡並輸出 → 重複第一個步驟。

本來 C++ 的話可以使用 cin >> ws 。但 ws 不只有吃掉空白字元,按下 tab 產生的「\t」字元以及換行字元。雖然字串裡沒有換行字元,但是有「\t」這個字元。因此,不能使用 cin >> ws 。

但是可以仿照 ws 內部的實作方法,自己寫一個只跳過空白字元的函式。而其需要輸入串流指標的操作。方法見以前的文章,不過比較需要用到 sgetc() 跟 snextc() (這篇沒講但用法跟sgetn() 差不了多少)。

作法相當直觀,一開始抓當前的字元(sgetc)。是空白就停下來;不是的話,就跳到下一個位置並抓取該字元(snextc)。重複以上步驟直到遇到 EOF (End of File,也就是輸入的結尾)或是遇到空白跳出。

接著需要一個紀錄這串空白一開始的位置之變數 last ,跟現在的位置 now (經過上面掠過這串空白後)去求差值。差值為偶數就不輸出任何東西;為奇數就輸出一個空白字元。

接著就直接 cin >> 進一個字元陣列(記得要最佳化 cin / cout,見這位大大的文章),然後輸出其內容。

然後重複以上步驟直到字串尾端,也就是 EOF (因為這題只有這一個字串要輸入)。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。




題外話:本篇是第 365 篇的題目。真的是沒想到可以持續更新一年。(雖然從 2018 / 7 / 24 到今天 2019 / 7 / 29 之間斷更了七次,所以不是真的「持續」)

儘管中間經歷了不少課堂的考試以及動力低迷的日子,但還是努力地擠出一題並更新。雖然有不少是水題,但我相信還是可以幫助到一些人。

畢竟,這是對自己的期許。連自己都搞自己可沒法跟別人共事。(不過那七次斷更……大概有兩次是自己的懶散倒是真的、一次因為程式競賽、一次因為出門,剩下的就忘了)

現在再回去看第一篇的心得,還是覺得當初的自己真的很瘋狂,竟然腦袋一熱開啟了這條更新之路。(文章本身沒有提及一天一題,因為那是自我期許XD)

總之,雖然有時候挺累人的,但確實收益良多。希望我也能讓各位讀者從中得到什麼。

今後,能不能繼續保持並不好說。不過,本人會盡力的。

在此,感謝所有觀看本人文章的讀者們。

創作回應

更多創作