leetcode_zigzag conversion
題目:
The string “PAYPALISHIRING” is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility)
P A H N
A P L S I I G
Y I R
And then read line by line: “PAHNAPLSIIGYIR”
我的答案:
版本一:
思路解析:遍歷整個(gè)字符串,將其按照之字形的結(jié)構(gòu),按列存儲(chǔ),顯然除了部分列的元素個(gè)數(shù)是numRows之外,其他列的元素個(gè)數(shù)都是1,為了后續(xù)字符重新排序的方便,將每列不含有字符串字符的地方用結(jié)束符代替,使得每列數(shù)據(jù)在存儲(chǔ)中占用相同的空間,在后續(xù)數(shù)據(jù)重新排序的時(shí)候,只需要循環(huán)遍歷所有的列并依次輸出各列的元素(遇到結(jié)束符的時(shí)候,不輸出該字符),在利用該方法的時(shí)候關(guān)鍵是保證一開(kāi)始在遍歷存儲(chǔ)字符串的時(shí)候要保證每列都占用相同的空間,并且所有列中的非結(jié)束符字符的存放結(jié)構(gòu)滿足之字形結(jié)構(gòu)。所以如果最后在遍歷字符串結(jié)束后,要判斷最后一列的元素是否為numRows個(gè),如不是需要利用結(jié)束符補(bǔ)全。整個(gè)算法的思想就是不用費(fèi)力去觀察之字形結(jié)構(gòu)的規(guī)律并建模,只需要按列存儲(chǔ)之后并循環(huán)遍歷輸出即可,比較好理解,但是運(yùn)行時(shí)間較長(zhǎng)。
版本二(進(jìn)階版):
思路解析:該版本的思想是觀察之字形結(jié)構(gòu)并進(jìn)行建模。舉例說(shuō)明:
假設(shè)輸入字符串為S,
S=”abcdefghijklmnopqrstuvwxyz”;
numRows=5;
以下是之字形中每行元素在字符串中的下標(biāo)(為了方便表述,從數(shù)據(jù)存儲(chǔ)的角度出發(fā),引入第0行):
第0行:0 8 16 24
第1行:1 7 9 15 17 23 25
第2行:2 6 10 14 18 22
第3行:3 5 11 13 19 21
第4行:4 12 20
觀察以上下標(biāo),可以得到結(jié)論,除了第0行與最后一行,每相隔的兩個(gè)下標(biāo)之間的距離都是:gap=2*numRows-2,每行的第一個(gè)元素的下標(biāo)都與行號(hào)相同;第0行與最后一行的各元素相鄰下標(biāo)的距離為gap;根據(jù)這個(gè)規(guī)律寫出以上代碼。顯然,利用這種方法不會(huì)消耗多余的空間,而且只需要遍歷一次字符串即可,算法高效。
總結(jié)
以上是生活随笔為你收集整理的leetcode_zigzag conversion的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: coreldraw x4如何重叠图片_C
- 下一篇: postman跨域测试_安装使用Hopp