ずっと5月

3日坊主してます

LeetCode#4 ZigZag Conversion

今日もやった。受け取った文字列を指定された行数でジグザグに配置したものを変えす。説明が難しい。 たとえば、"あいうえおかきくせこさしすせそ" という文字列と3を引数に受け取ったら、
f:id:uminokaze521:20200103141655p:plain
になる。行数が4で指定されたら

f:id:uminokaze521:20200103141657p:plain
になる。
公式の問題を読んだほうが良いかもしれない。

leetcode.com

解いたコードがこれ。 ジグザグが一回りする文字数は、2 * numRows - 2で求められる。
上から1行ごとに計算していくとよさそうだった。

class Solution {
    func convert(_ s: String, _ numRows: Int) -> String {
        if numRows == 1 {return s}
        let length:Int = s.count
        let cycleLen:Int = 2 * numRows - 2
        var ans:String = ""
        for i in 0..<numRows {
            for j in stride(from: 0, to: length - i, by: cycleLen) {
                ans.append(s[s.index(s.startIndex, offsetBy: i + j)])
                if (i != 0) && (i != numRows - 1) && (j + cycleLen - i < length) {
                    ans.append(s[s.index(s.startIndex, offsetBy: j + cycleLen - i)])
                }
            }
        }
        return ans
    }
}

この方法の他にもソートする方法があるらしい。

leetcode.com