Leetcode练习题06-N字形变换

将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。

比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下:

P   A   H   N
A P L S I I G
Y   I   R

之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"

请你实现这个将字符串进行指定行数变换的函数:

string convert(string s, int numRows);

示例 1:

输入:s = "PAYPALISHIRING", numRows = 3
输出:"PAHNAPLSIIGYIR"

示例 2:

输入:s = "PAYPALISHIRING", numRows = 4
输出:"PINALSIGYAHRPI"
解释:
P     I    N
A   L S  I G
Y A   H R
P     I

示例 3:

输入:s = "A", numRows = 1
输出:"A"

提示:

  • 1 <= s.length <= 1000
  • s 由英文字母(小写和大写)、',' 和 '.' 组成
  • 1 <= numRows <= 1000

思路

将N的第一竖和斜线部分记作一个Node,以class的形式存储下来。随后将s转换为Node的容器集合,通过查找其中的索引规律即可求解。

源代码

class Solution 
{
public:
    class Node
    {
        private:
        int numRows;
        bool full;
        vector<char> line_v;
        vector<char> line_h;
        string toString(char c)
        {
            if(c==' ') return "";
            string res;
            res.push_back(c);
            return res;
        }

        public:
        Node(int n)
        {
            numRows=n;
            full=false;
        }
        void push_back(char c)
        {
            if(full) return;
            if(line_v.size()<numRows)
            {
                line_v.push_back(c);
                if(numRows==2&&line_v.size()==2)
                    full=true;
                return;
            } 
            if(line_v.size()>=numRows)
            {
                line_h.push_back(c);
                if(line_h.size()>=numRows-2) full=true;
            }
        }
        string get_line(int n)
        {
            if(n==0) return toString(line_v[0]);
            else if(n==numRows-1) return toString(line_v[n]);
            else return toString(line_v[n])+toString(line_h[numRows-n-2]);
        }
        bool isFull(){return full;}
    };
    
    string convert(string s,int numRows) 
    {
        if(numRows==1) return s;
        vector<Node> nodes;
        Node empty_node(numRows);
        nodes.push_back(empty_node);
        for(int i=0;i<s.size();i++)
        {
            if(nodes[nodes.size()-1].isFull())
                nodes.push_back(empty_node);
            nodes[nodes.size()-1].push_back(s[i]);
        }
        while(!nodes[nodes.size()-1].isFull())
        {
            nodes[nodes.size()-1].push_back(' ');
        }
        string* lines=new string [numRows];
        string result;
        for(auto node:nodes)
        {
            for(int i=0;i<numRows;i++)
                lines[i]+=node.get_line(i);
        }
        for(int i=0;i<numRows;i++)
        {
            result+=lines[i];
        }
        delete[] lines;
        return result;
    }
};
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇