我的思路:把字串按照z字形排列有個特點就是週期性,每個週期中字元的排列方式相同,所以摸清他們排列時的規律即可。通過發現某一列字元的排列方式和他所在這一列的位置有關,也就是形成了字元排列方式和該列所在位置形成對應關係。如果當前所在的列是乙個週期的第一列,則使用字元將該列填充滿,如果當前列是乙個週期的第二列,那麼在該列倒數第二個位置放置乙個字元,如果當前列是乙個週期的第三列,那麼在該列倒數第三個位置放置乙個字元....以此類推,而且放置單個字元的位置也可以和當前列數形成對應關係。所以我們需要得到所給字串一共形成多少列、乙個週期有多少列。
public class solution6
//計算列數
int charnum = 2*numrows - 2;//乙個週期字元數
int col = numrows - 1;//乙個週期列數
int colnum;
colnum = (len/charnum)*col;
int sheng = len + 1 -(len/charnum) * charnum;
if( sheng <= numrows ) else
//填充二維陣列
char chararray = new char[numrows][colnum];
char strarray = s.tochararray();
int p = 0;
int num;
for ( int i=0; i解法中使用二維字元陣列形象的表示將字串z字形排列的結果,陣列中有字元的元素的位置剛好是個z字形。
為了輸出最終的字串,還需要建立乙個一維字元陣列,然後遍歷二維字元陣列,將裡面的字元不為空的元素賦值給一維陣列,再將一維陣列轉換成字串返回。
這一套方法寫下來我都覺得很笨,但至少能執行下來,直到看到官方解法,真的是聰明。。。
官方解法:
使用min(numrows,len(s))個stringbuilder來儲存z字形每一行的字串,將這幾個stringbuilder放到乙個arraylist中。從左到右遍歷所給字串,在arraylist中使用當前方向來表示字元放置的位置。使用當前行來改變當前方向,當當前行在最上面一行或者最下面一行時,當前方向改變。
class solution
stringbuilder ret = new stringbuilder();
return ret.tostring();
}}
stringbuilder是乙個字串可改變的物件。string物件是不可改變的。每次使用 system.string類中的修改方法時,都要在記憶體中建立乙個新的字串物件,這就需要為該新物件分配新的空間。在需要對字串執行重複修改的情況下,與建立新的 string物件相關的系統開銷可能會非常昂貴。如果要修改字串而不建立新的物件,則可以使用system.text.stringbuilder類。 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...