Leetcode——6. ZigZag Conversion

1. 概述

题目的原文是这样的:

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" .
它需要的便是输入一个字符串,就输出Z字形的字符串====》说到底就是坐标变换的规则,下面以13个字符的字符串(“abcdefghjklmno”),4行(用N表示)为例子进行说明:

从上面的表格中可以看到列(对应上表中不是斜线上的部分,如0,3列)的坐标规则是f(x) = x + i*(2*N-2),i=0,1,2,3,4...
斜线上的坐标为:f(x) = x + i*(2*N-2) - 2*x = i*(2*N-2) - x ; i=0,1,2,3...(i与上式中同义)

2. 编码

class Solution {
public:
    string convert(string s, int numRows)
    {
        int m_strlen(s.length());   //获得字符串的长度
        if(0==m_strlen || 1==m_strlen || 2==m_strlen || numRows==1 || numRows>=m_strlen)
            return s; 
        char* data = new char[m_strlen+1];
        for(int i=0; i<(m_strlen+1); i++)
            data[i] = '\0';

        int pos(0);
        for(int i=0; i<m_strlen; i++)
        {
            if(i*(2*numRows-2) < m_strlen)
            {
                data[pos++] = s.at(i*(2*numRows-2));
            }
            else
                break;
        }   //第一行的数据
        
        int cols = pos+1;
        for(int i=1; i<numRows-1; i++)
        {
            for(int j=0; j<cols; j++)
            {
                if(i + j*(2*numRows-2) < m_strlen)
                {
                    if(i + j*(2*numRows-2)-2*i > 0)
                        data[pos++] = s.at(i + j*(2*numRows-2)-2*i);   //该列前面的数
                    data[pos++] = s.at(i + j*(2*numRows-2));       //该列的数
                }
                else if((i + j*(2*numRows-2)) >= m_strlen && ((i+j*(2*numRows-2)-2*i) < m_strlen) &&
                    ((i+j*(2*numRows-2)-2*i) > 0))
                {
                    data[pos++] = s.at(i+j*(2*numRows-2)-2*i);
                    break;
                }
            }
        }   //z字型行走的行数
        
        for(int i=0; i<cols; i++)
        {
            if(numRows-1 + i*(2*numRows-2) < m_strlen)
            {
                data[pos++] = s.at(numRows-1 + i*(2*numRows-2));
            }
            else
                break;
        }   //最后一行的数据
        
        string temp(data);
        delete[] data;
        data = nullptr;
        return temp;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值