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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Z字形变换(LeetCode第6题)

發(fā)布時間:2023/12/19 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Z字形变换(LeetCode第6题) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目描述:(力扣)

廢話后面說,直接貼代碼

class Solution { public:string convert(string s, int numRows) {if (numRows == 1)return s;string ans("");int down = 2 * numRows - 4, up = 2;//設置up、down的初值for (int i = 0; i < numRows; i++) {int k = i,flag = 1;//第一行和最后一行的循環(huán)if (i == 0 || i == numRows - 1) {while (k < s.size()) {ans+=s[k];k = k + 2*numRows-2;}continue;}//中間行(第一行和最后一行之間的行)的循環(huán)elsewhile (k < s.size()) {ans += s[k];flag++ % 2 == 1 ? k += down : k += up;//用flag判斷每次循環(huán)讀取需跳躍的值}down -= 2;up += 2;//每結束一次中間行的循環(huán)up和down要變一次}return ans;} };

提交,代碼效率:

(大神看到這可以慢走了(..) )
看不懂代碼思路的同學,可以耐心再聽我嘮一嘮(ノ゚▽゚)


仔細觀察一下這個圖案,我們能想到最快的辦法就是先把“LDR”提出來,再依次把“EOEII”、“ECIHN”、“TSG”提取出來,將它們連起來就好了。難點在于怎么知道‘L’的下一個提取目標是‘D’呢。

(在這里,我把圖案中每一個Z字形中間出現的列數標記為m,像上圖,當n=4的時候,m=2。不難發(fā)現m和n之間的規(guī)律是m=n-2。)

**情況1:觀察第一行下標變化 ( 當n=4時,L跳躍到D,下標需要增加6=n+m) 可以發(fā)現這種情況適用于第一行和最后一行。

**情況2:中間行下標變化(1<?<n)

n=4,下標跳躍序列:
2-> +4+2,+4,+2
3-> +2,+4,+2,+4

n=5,下標跳躍序列:
2-> +6+2,+6,+2
3-> +4,+4,+4,+4
4-> +2,+6,+2,+6

n=6,下標跳躍序列:
2-> +8+2,+8,+2
3-> +6,+4,+6,+4
4-> +4,+6,+4,+6
5-> +2,+8,+2,+8

相信你們已經發(fā)現了一些啥了,沒錯,中間行的跳躍序列排在一塊后,從列看下來一列遞減(down)一列遞增(up),所以我們只需要知道他們的初始值與m、n的關系就可以了。

int down = ( m + n) - 2, up = 2;//設置up、down的初值

每行的下標跳躍只要遵守當前設定好的up、down值,就可以將中間行的字符串順利提取。這時候,我們只需要在提取第n行和第n+1行之間,將up、down做遞增和遞減:

down -= 2;up += 2;//每結束一次中間行的循環(huán)up和down要變一次

好了,這就是這周分享的全部內容啦
(我太懶了只挑了我覺得自己做的還挺好的這一題)
繼續(xù)加油吧奧利給!

總結

以上是生活随笔為你收集整理的Z字形变换(LeetCode第6题)的全部內容,希望文章能夠幫你解決所遇到的問題。

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