把整個問題拆解為: 儲存-取 的兩個過程;
通過觀察我發現的是,當numrows
為3時,兩列之間的數字的數目為1;當numrows
為4時,兩列之間的數字的數目為2,以此類推。那麼,可不可以將每一列都存起來(col
),兩列之間的數字也存起來(gap
),最後要輸出時再通過遍歷的方式拼接出結果呢?
以題目中給的字串paypalishiring
為例子,將每一列(col
)和它右邊的兩列之間的數字(gap
)作為一組:
儲存完為:
乙個需要注意的問題
乙個需要注意的問題是,有可能在遍歷完輸入的字串的時候,沒有來得及儲存當前的子陣列,這個時候可以通過引入乙個遍歷,在迴圈外補充最後一次的儲存操作(詳見**);
取首尾兩行
那麼,接下來,可以先取首行和尾行的字串拼接成head
和tail
,因為首尾兩行是不涉及兩列之間的資料的,由上圖就可以知道:
首尾兩行也就是二維陣列col
中,每乙個子陣列的第乙個元素即為首,最後乙個元素即為尾;
取中間的行
如果要取中間的行,就會發現其實上面中,那樣儲存時,gap
這個是錯的,因為,在儲存時,是按照原來字串的字元順序儲存的,比如gap
的第乙個子陣列['a', 'l']
,但是,在得出結果時,是先遍歷得到第二行的l
,然後才是第三行的a
。因此,在儲存gap的時候,需要對每個子陣列進行逆序操作,正確的儲存結果應該為:
遍歷出第二行的結果為:alsig
, 第三行結果為:yahr
string chartostr(char c)
string convert(string s, int numrows)
int s_sz = s.size();
if (s_sz == 0 || s_sz == 1)
return s;
/// 儲存的過程
int gap_num = numrows - 2; // numrows:3,gap_num:1
// numrows:4,gap_num:2
// 3 1 3 1 3 1 ; 每乙個3代表了含有三個資料的陣列,如[pay]
vector
> col; // 儲存每一列的資料,如[pay] [ali] [hir]
vector
> gap; // 儲存列與列之間的資料,如[p] [s] [i]
vector
tmp_col(numrows);
vector
tmp_gap(gap_num);
int flag = 0; // 有可能出現i==s_sz,但是沒有儲存對應的tmp_col和tmp_gap的情況
for (int i = 0, j = 0, m = 0, n = 0; i < s_sz; )
else
else}}
if (flag == 0)
/// 取字元的過程
// 空的部分為'\0',不進行處理
int set_num = s_sz / (numrows + gap_num); // 組數,不包括多餘的
if (s_sz % (numrows + gap_num) != 0)
set_num += 1;
//先取出首尾兩行
string head = "", tail = "";
for (int i = 0; i < set_num; i++)
if (col[i][numrows - 1] != '\0')
}// 拼中間的
string mid = "";
for (int i = 1; i < numrows - 1; i++)
if (gap[j][i - 1] != '\0')}}
string res = head + mid + tail;
return res;
}
LeetCode 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 輸入 s pa...
leetcode 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 示例 1 輸入...
LeetCode 6 Z字形變換
題目鏈結 題目描述 將字串 paypalishiring 以z字形排列成給定的行數 p a h n a p l s i i g y i r之後從左往右,逐行讀取字元 pahnaplsiigyir 實現乙個將字串進行指定行數變換的函式 string convert string s,int numro...