zoukankan      html  css  js  c++  java
  • 006 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".

    详见:https://leetcode.com/problems/zigzag-conversion/description/

    解题思路:
    1. 每一组 V 字形的长度为 size = 2 * line - 2 (斜向上的部分没有第一行和最后一样的元素),line 是行数
    2. 对于垂直向下的一列元素来说,每一组向下的列之间间隔 size 大小,即一组元素的个数。
    3. 对于斜向上的元素来说,它们的位置位于当前组 size - i(i 为该元素所在的行数,一组有 size 个字符,倒数第 i 个,位置为 size -i)。当前组的第一个字符所在位置为 j - i (j 为与斜向上的元素同在一行的,垂直向下的列的元素在字符串中的序号,i 为它们共同的行号)。
    即:j-i就是zigzag的起始字符,然后我们是要倒数第i个,因为一个zigzag有size个字符,所以倒数第i个就是size-i,我们要赋值的字符就是(j-i)+(size-i)=j+size-2*i

    class Solution {
    public:
        string convert(string s, int numRows) {
            if(s.empty()||numRows==1)
            {
                return s;
            }
            string res="";
            int len=s.size();
            int size=numRows*2-2;
            for(int i=0;i<numRows;++i)
            {
                for(int j=i;j<len;j+=size)
                {
                    res+=s[j];
                    if(i!=0&&i!=numRows-1&&j+size-2*i<len)
                    {
                        res+=s[j+size-2*i];
                    }
                }
            }
            return res;
        }
    };
    
  • 相关阅读:
    Linux查看当前系统的发行版信息
    用 CentOS 7 打造合适的科研环境
    消息队列的使用场景
    RabbitMQ几种Exchange 模式
    JMS规范概览
    消息队列的学习
    springMVC参数传递实例
    java8时间处理实例
    windows电脑常用必备软件
    http后台json解析实例
  • 原文地址:https://www.cnblogs.com/xidian2014/p/8681902.html
Copyright © 2011-2022 走看看