leetcode 6 Z字形變換

2021-09-28 10:38:14 字數 1092 閱讀 1182

對於這道題,最好的辦法莫過於找到這個函式,一次遍歷,直接安排,就是這樣。

這個函式我們可以由繁雜到簡單,由具體到抽象這樣化簡,這樣形成乙個終極有用函式。

首先呢,給定字元長度和行數,我們就可以構建乙個矩陣,行為行數,列為字元長度/行數+1,多幾個或者多一列是沒有關係的,畢竟都是0,然後呢,分為向下排列和斜上排列,向下排列就乙個行數,斜上排列是行數-2(保證行數大於3),算了算了,就開乙個二維陣列,然後遍歷兩遍,時間複雜度仍然為o(n),沒什麼關係的。

看看網上,也是差不多。

慢著,放棄不是你的性格啊小衰?!!今天我就要把這個函式搞出來,做乙個標新立異的人。

這個函式,它的形式是這樣的:

int new_pos(string s, int pos, int line);

輸入字串,字元在字串中的位置,和行數,得出它的新位置,然後新字串直接

new_str[new_pos(s, i, line)] = s[i];

就解決了!感覺不錯。

首先要定位這個字元在二維陣列中的位置,字串有清晰的劃分,前n個是在一列,多少行就是在n裡面的個數,後n-2個是在不同的列,緊接著又是n個。。。貌似用if更直接美觀啊?

好吧好吧我放棄了,既然if一樣快,我還搞個毛。。。因此,如果是時間複雜度一樣的話,沒必要去弄一些奇技淫巧。

這道題說的很寬泛,因此我們就必須注意其極限條件,除非它說沒有空串,你才能不考慮空串,否則的話就需要考慮。一般程式設計過程就是先把大綱編好,然後再普遍情況通過,然後再考慮極限條件,只有這樣才能做對乙個題。如何考慮極限條件呢?就是按照極限條件進行往下推導,**有不對改**,就這樣。

而最快的辦法,就是用調bug的方法。

如果你非得用自己看的話,那就在程式設計的時候,知道**有缺陷,乙個todo記下來,編完了再改正,就這樣,如果特殊情況實在雜糅不進去的,你就要新開乙個if,就這樣更簡單。

如果這樣做千萬要容量要夠,實際上,陣列法根本是不可行的,記住列要設的跟字串長度一樣長,為什麼,因為如果行相當長,那麼等斜著的時候,就會浪費非常多的空間,遍歷的時候時間也會很很長,因此公式法還是非常有必要的。

LeetCode 6 Z字形變換

將字串 paypalishiring 以z字形排列成給定的行數 p a h n a p l s i i g y i r之後從左往右,逐行讀取字元 pahnaplsiigyir 實現乙個將字串進行指定行數變換的函式 string convert string s,int numrows 輸入 s pa...

leetcode 6 Z字形變換

將字串 paypalishiring 以z字形排列成給定的行數 p a h n a p l s i i g y i r之後從左往右,逐行讀取字元 pahnaplsiigyir 實現乙個將字串進行指定行數變換的函式 string convert string s,int numrows 示例 1 輸入...

LeetCode 6 Z字形變換

把整個問題拆解為 儲存 取 的兩個過程 通過觀察我發現的是,當numrows為3時,兩列之間的數字的數目為1 當numrows為4時,兩列之間的數字的數目為2,以此類推。那麼,可不可以將每一列都存起來 col 兩列之間的數字也存起來 gap 最後要輸出時再通過遍歷的方式拼接出結果呢?以題目中給的字串...