演算法學習之路-堅持走下去
題目描述
l c i r
e t o e s i i g
e d h n
string convert(string s, int numrows);
當我再次遇到時,仍舊不會
冷靜分析
以字串。helloworld 為例
行數為1時的圖案
helloworld 輸出: helloworld
行數為2
h l o o l
e l w r d 輸出: hloolelwrd
行數為3
h o l
e l w r d
l o 輸出: holelwrdlo
不難發現當行數為1和2的時候,情況變得十分簡單
當行數為1的時候,我們每隔0個字元取乙個字元進行第一行的z字形繪製
當行數為2的時候,我們每隔1個字元取乙個字元進行,,,
當行數為3的時候,我們每隔3個字元取乙個字元進行,,,
,,,在不考慮中間字元的情況下,每一行的字元都符合此規律
以行數為3的z字形圖案為例,在不考慮中間字元的情況下
每一行的字元與該行下乙個字元都相距 著。 2*3-2=4個字元。綜上可以實現已有的**邏輯
public string convert
(string s,
int numrows)
int len = s.
length()
;// 與行數相關,間隔範圍
int cycle = numrows*2-
2;stringbuilder res =
newstringbuilder()
;// 按行讀取,每一行進行訪問
for(
int i =
0; i < numrows; i++)}
return res.
tostring()
;}
先定義乙個長度較長的字串。 hinihaomwoshidhuilang
行數為4
h o i a
i a m h d l n
n h w s h i g
i o u
行數為5
h w u
i m o h i
n o s a l
i a h d a g
h i n
觀察發現在首行和尾行,我們的圖形不需要考慮中間字元的情況
當我們讀取i之後需要讀取下乙個字元,對於行數為4的情況來說,需要隔3個字元,
總結規律:行數為4為例 隔6個字元取乙個數字
i:當前行1,隔字元數3 a:6-1=5. h:6-2=4
n:當前行2,隔字元數1。
在我們的**中。 i為當前行數,j+i 為當前位置索引,j+i+cycle 為 m 的索引下標位置
總結:當行數為 rows 除去首尾行中間字元位置規律為
(2*rows-2)+j-i,當行數為4,那麼即為6+j-i
a: 6+0-1 h: 6+6-1 l: 6+12-1
h: 6+0-2 s: 6+6-2 i: 6+12-2
可得到完整版**
public string convert
(string s,
int numrows)
int len = s.
length()
;int cycle =
2*numrows-2;
stringbuilder res =
newstringbuilder()
;for
(int i =
0; i < numrows; i++)}
}return res.
tostring()
;}
Leetcode記錄 6題 z字形變換
思路 總共n行,新建n個stringbuilder,依次從上到下給每個stringbuilder賦值,每兩列一組,前面一列先從上到下依次賦值,後面一列從倒數第二行依次向上賦值到第二行結束。最後將n個字串相連。時間複雜度 o n n是字串長度。class solution int index 0 wh...
leetcode題庫 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 p...
LeetCode第六題 Python版本
title leetcode no.6 categories tags 本題的實質就是模擬,雖然ac了,但是空間複雜度有點高,時間複雜度的話就是o len s 主要是找不到乙個合適的儲存,我只能用numpy儲存了,大小的話和numrow有關。將乙個給定字串 s 根據給定的行數 numrows 以從上...