LeetCode - Z 字形變換

題目鏈接:https://leetcode-cn.com/problems/zigzag-conversion

題目描述

將一個給定字符串根據給定的行數,以從上往下、從左到右進行 Z 字形排列。

比如輸入字符串爲 “LEETCODEISHIRING” 行數爲 3 時,排列如下:

L   C   I   R
E T O E S I I G
E   D   H   N

之後,你的輸出需要從左往右逐行讀取,產生出一個新的字符串,比如:“LCIRETOESIIGEDHN”。
請你實現這個將字符串進行指定行數變換的函數:

string convert(string s, int numRows);

示例1:

輸入: s = “LEETCODEISHIRING”, numRows = 3
輸出: “LCIRETOESIIGEDHN”

示例2:

輸入: s = “LEETCODEISHIRING”, numRows = 4
輸出: “LDREOEIIECIHNTSG”

解釋:
L     D     R
E   O E   I I
E C   I H   N
T     S     G

我的思路

  • 做完看了下其他人的答案,感覺大部分人都把這道題搞得有點複雜了。
  • 這道題可以這麼考慮:對於輸入的字符串s,其下標 i / (numRows-1) 如果爲偶數或零,則代表該下標代表的字符在Z字型中屬於豎列。如果 i / (numRows-1) 如果爲奇數,則代表該下標代表的字符在Z字型中屬於斜列(Z字型的中間傾斜部分)。
  • 如果當前字符屬於豎列,則按照正序依次保存在字符串數組 temp 中(temp[remain].push_back(s[i])),如果屬於斜列,則逆序保存(temp[numRows-remain-1].push_back(s[i]))。
  • 最後將 temp 數組依次按序輸出就是最終答案。
class Solution {
public:
    string convert(string s, int numRows) {
        vector<string> temp(numRows);
        string res;
        if(s.empty() || numRows < 1) return res;
        if(numRows == 1) return s;
        for(int i = 0; i < s.size(); i++){
            int ans = i / (numRows-1);
            int remain = i % (numRows-1);
            if(ans % 2 == 0){                           //結果爲偶數或0
                temp[remain].push_back(s[i]);              //按餘數正序保存
            }
            if(ans % 2 != 0){                           //結果爲奇數
                temp[numRows-remain-1].push_back(s[i]);    //按餘數倒序保存
            }
        }
       for(int i = 0; i < temp.size(); i++){
               res += temp[i];
        }
        return res;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章