Leetcode-Z字形変換(6)


タイトル記述は、所与の文字列sを所与の行数numRowsに従って、上から下へ、左から右へZ字状に配列する.例えば入力文字列が「PAYPALISHIRING」の行数が3の場合、以下のように配列されています.文字列を指定した行数変換する関数:string convert(string s,int numRows);
入力: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)