leetcode 6 ZigZag Conversion

題目詳情

The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility)
*P A H N
*A P L S I I G
*Y I R
And then read line by line: "PAHNAPLSIIGYIR"
Write the code that will take a string and make this conversion given a number of rows:
string convert(string text, int nRows);
convert("PAYPALISHIRING", 3) should return "PAHNAPLSIIGYIR".

題目的意思是,輸入一個字符串(s)和一個目標行數(nRows)。要求咱們在‘之字形’從新排列這個字符串後,再按正常的從上到下,從左至右的順序輸出拼接好的字符串。app

clipboard.png 之字形字符排列順序如圖ui

想法

  • 首先須要意識到,每一次的垂直向下+斜向上的排列造成了一個重複的週期。而這個週期所包含的字符數是nRows*2-2.
  • 對於字符串s中位置爲i的字符,i除週期得到的餘數決定了它所在的行數。
  • 所以對於每個字符,咱們判斷它應該在哪一行,而後將它加到它所在行的字符序列的尾部。
  • 最後咱們合併每一行,得到最後的結果。

解法

public String convert(String s, int numRows) {
        if(numRows == 1 || s.length() < numRows)return s;
        StringBuilder[] res = new StringBuilder[numRows];
        int period = numRows*2 -2;
        for(int i=0;i<res.length;i++){
            res[i]=new StringBuilder("");
        }
        
        for(int i=0;i<s.length();i++){
            int remainder = i % period ;           
            if(remainder > numRows-1){
                res[period-remainder].append(s.charAt(i));
                continue;
            }
            res[remainder] = res[remainder].append(s.charAt(i));
        }
        
        String resStr = "";
        for(StringBuilder str : res){
            resStr += str;          
        }
        
        return resStr;
    }
相關文章
相關標籤/搜索