zoukankan      html  css  js  c++  java
  • [LeetCode] 6. ZigZag Converesion 之字型转换字符串

    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".

    这道题就是看坐标的变化,找规律并分块处理。参考:爱做饭的小莹子

    规律:第一行和最后一行,就是按照2n-2的顺序一点点加的。斜着那条线的字的位置是当前列j+(2n-2)-2i(i是行的index)。

    Java:

    public String convert(String s, int nRows) {  
            if(s == null || s.length()==0 || nRows <=0)  
                return "";  
            if(nRows == 1)  
                return s;
                
            StringBuilder res = new StringBuilder();  
            int size = 2*nRows-2;  
            for(int i=0;i<nRows;i++){  
                for(int j=i;j<s.length();j+=size){  
                    res.append(s.charAt(j));  
                    if(i != 0 && i != nRows - 1){//except the first row and the last row
                        int temp = j+size-2*i;
                        if(temp<s.length())
                            res.append(s.charAt(temp));
                    }
                }                  
            }  
            return res.toString();  
        }
    

    Python:

    class Solution(object):
        def convert(self, s, numRows):
            """
            :type s: str
            :type numRows: int
            :rtype: str
            """
            if numRows == 1:
                return s
            step, zigzag = 2 * numRows - 2, ""
            for i in xrange(numRows):
                for j in xrange(i, len(s), step):
                    zigzag += s[j]
                    if 0 < i < numRows - 1 and j + step - 2 * i < len(s):
                        zigzag += s[j + step - 2 * i]
            return zigzag
    

    C++:

    class Solution {
    public:
        string convert(string s, int nRows) {
            if (nRows <= 1) return s;
            string res = "";
            int size = 2 * nRows - 2;
            for (int i = 0; i < nRows; ++i) {
                for (int j = i; j < s.size(); j += size) {
                    res += s[j];
                    int tmp = j + size - 2 * i;
                    if (i != 0 && i != nRows - 1 && tmp < s.size()) res += s[tmp];
                }
            }
            return res;
        }
    };
    

      

      

    All LeetCode Questions List 题目汇总

      

  • 相关阅读:
    Python动态生成Bean类,并且带toString,equals,hashcode方法
    逆向工程核心原理——第十八章
    逆向工程核心原理——第十七章
    逆向工程核心原理——第十六章
    逆向工程核心原理——第十五章
    Creckme_bjanes.1
    CTF_python-trade
    大二下学期阅读笔记(人月神话)
    大二下学期个人作业(三个和尚)
    大二下学期团队项目(收藏转移)
  • 原文地址:https://www.cnblogs.com/lightwindy/p/8487253.html
Copyright © 2011-2022 走看看