首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

LeetCode ZigZag Conversion:之字形變換規律與實現

     編輯:C++ 入門

問題描述

將字符串按之字形(Z 字形)排列在 nRows 行中,逐行讀取生成新字符串。例:
"PAYPALISHIRING", 3 行 →
P A H N
A P L S I I G
Y I R
輸出 "PAHNAPLSIIGYIR"。

規律分析

第 0 行與第 nRows-1 行:字符間隔固定為 2*nRows - 2。
中間行 i:交替間隔 2*(nRows-1-i) 和 2*i。

Java 實現

public String convert(String s, int nRows) {
    if (nRows <= 1 || s.length() <= nRows) return s;
    StringBuilder res = new StringBuilder();
    for (int i = 0; i < nRows; i++) {
        int index = i;
        res.append(s.charAt(index));
        boolean flag = true;
        for (int k = 0; index < s.length(); k++) {
            if (i == 0 || i == nRows - 1) index += 2 * nRows - 2;
            else {
                if (flag) index += 2 * (nRows - 1 - i);
                else index += 2 * i;
                flag = !flag;
            }
            if (index < s.length()) res.append(s.charAt(index));
        }
    }
    return res.toString();
}

複雜度

時間 O(n),空間 O(n)(輸出字符串)。單次遍歷,無需額外矩陣。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved