leetcode第六題Z字形變換心得記錄

2021-10-23 15:08:18 字數 2295 閱讀 1225

演算法學習之路-堅持走下去

題目描述

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 以從上...