Leetcode-Z字形変換(6)
タイトル記述は、所与の文字列sを所与の行数numRowsに従って、上から下へ、左から右へZ字状に配列する.例えば入力文字列が「PAYPALISHIRING」の行数が3の場合、以下のように配列されています.文字列を指定した行数変換する関数:string convert(string s,int numRows);
入力:s=“PAYPALISHIRING”,numRows=3出力:“PAHNAPLSIIGYIR”
問題を解く構想1.この行数が3行を超えていない場合は、この文字列を直接返すといいです.
2.実は私たちは行によって放して、それでは私たちも行によって対応する配列の中に入れて、つまり1行目の私たちはres[0]、2行目はres[1]...このように押します
しかし、Z字形、すなわち頭、改行する、すなわちi=0またはi=numRows-1の場合、改行するにはflagで表すことができます.すなわち、改行が必要な場合、flag=-flag
3.最後に文字列を合わせると最後に得られる文字列になります
アルゴリズムフロー
コードJava
Python
入力:s=“PAYPALISHIRING”,numRows=3出力:“PAHNAPLSIIGYIR”
問題を解く構想1.この行数が3行を超えていない場合は、この文字列を直接返すといいです.
if (numRows < 2) return s # 0
2.実は私たちは行によって放して、それでは私たちも行によって対応する配列の中に入れて、つまり1行目の私たちはres[0]、2行目はres[1]...このように押します
しかし、Z字形、すなわち頭、改行する、すなわちi=0またはi=numRows-1の場合、改行するにはflagで表すことができます.すなわち、改行が必要な場合、flag=-flag
3.最後に文字列を合わせると最後に得られる文字列になります
アルゴリズムフロー
res[i] += c: c ;
i += flag: c ;
flag = - flag: Z , 。
コードJava
class Solution {
public String convert(String s, int numRows) {
if(numRows < 2) return s;
List<StringBuilder> rows = new ArrayList<StringBuilder>();
for(int i = 0;i<numRows;++i){
rows.add(new StringBuilder());
}
int i = 0,flag = -1;
for(char c : s.toCharArray()){
rows.get(i).append(c);
if(i == 0 || i == numRows -1) flag =-flag;
i += flag;
}
StringBuilder res = new StringBuilder();
for(StringBuilder row : rows) res.append(row);
return res.toString();
}
}
Python
class Solution:
def convert(self, s: str, numRows: int) -> str:
if numRows < 2:
return s
i,flag = 0,-1
res = ["" for _ in range(numRows)]
for c in s:
res[i] += c
if i == 0 or i == numRows -1:
flag = -flag
i += flag
return "".join(res)