看到題目就覺得有戲,看起來複雜了一點,但是憑我的感覺,這題用暴力是比較容易做的,只是可能比較繁瑣。
z型變換,實際上是n型,不過都無所謂,我用乙個二維陣列往裡一套,後面再遍歷拼接成字串,就ok了。只是在往二維陣列裡放值的時候,條件不容易控制,需要慢慢找規律。
思路因為需要慢慢找規律,所以我在草稿紙上畫了一下圖:
這是主要的處理邏輯,然後再對一些特殊和臨界情況進行處理就ok了
首次通過
public
static string convert
(string s,
int numrows)
if(numrows ==2)
else
}for
(int n =
0; n < chars.length; n++)}
}return stringbuilder.
tostring()
;}else
chars[j]
[linecount *
(numrows -1)
]= s.
charat
(i + j);}
i += numrows;
for(
int j =
0; j < numrows -
2; j++
) chars[numrows -
2- j]
[(linecount)
*(numrows -1)
+ j +1]
= s.
charat
(i + j);}
i += numrows -3;
linecount++;}
}for
(int n =
0; n < chars.length; n++)}
}return stringbuilder.
tostring();}}
**冗餘較多,提交結果
初次優化
public
static string convert
(string s,
int numrows)
char
chars =
newchar
[numrows]
[length /2+
1];if
(numrows ==2)
else}}
else
chars[j]
[linecount *
(numrows -1)
]= s.
charat
(i + j);}
i += numrows;
for(
int j =
0; j < numrows -
2; j++
) chars[numrows -
2- j]
[(linecount)
*(numrows -1)
+ j +1]
= s.
charat
(i + j);}
i += numrows -3;
linecount++;}
}}for(
int n =
0; n < chars.length; n++)}
}return stringbuilder.
tostring()
;}
思路沒有變,對一些冗餘的**進行抽取,提交結果
嘿嘿!還不錯。**還可以再簡化一點,但是**簡化了,效率方面卻沒有提公升,可能是因為邏輯沒有變,只是改進了寫法。所以**也就不貼了。
官方給出的題解,也是類似於找規律,但是他找的規律巧妙得多,他利用的是:也是將每個字元放入乙個類似二維陣列的容器,安裝這個n性移動的時候,每次這個行都是朝著乙個方向變的,只是到了頂部或者底部,才會轉向,他就利用了這個特點,巧妙的控制行的變動,最後將這個類似二維陣列的容器再拼接成乙個字串。
**
public string convert
(string s,
int numrows)
stringbuilder ret =
newstringbuilder()
;for
(stringbuilder row : rows) ret.
(row)
;return ret.
tostring()
;}
提交結果
每次官方給出的答案都是如此巧妙,總是簡潔又能完成功能,而且效率還不錯,真好奇這些人腦子裡面裝的是什麼。
哈哈,估計這哥們和我一樣,花了老大工夫,寫了幾十上百行**,還沒人家寫的十幾行**效率高。
今日拿下兩題,噢力給!!!!
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 示例...
6 Z字形變換
將字串 paypalishiring 以z字形排列成給定的行數 p a h n a p l s i i g y i r 之後從左往右,逐行讀取字元 pahnaplsiigyir 示例1 輸入 s paypalishiring numrows 3 輸出 pahnaplsiigyir 示例 2 輸入 s...
6 Z 字形變換
將乙個給定字串根據給定的行數,以從上往下 從左到右進行 z 字形排列。比如輸入字串為 leetcodeishiring 行數為 3 時,排列如下 l c i r e t o e s i i g e d h n之後,你的輸出需要從左往右逐行讀取,產生出乙個新的字串,比如 lciretoesiigedh...