`
cozilla
  • 浏览: 88970 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

[LeetCode] ZigZag Conversion

 
阅读更多
ZigZag ConversionDec 6 '11

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

 

总感觉写的很2b。

class Solution {
public:

    string convert(string s, int nRows) {
        int size = s.size();
        if (size == 0) return s;
        if (nRows == 1) return s;
        string tmp; tmp.resize(size);
        std::vector<int> ls(nRows);
        int step = 2 * nRows - 2;
        int rows = size / step;
        int left = size - rows * step;
        ls[0] = rows + (left > 0 ? 1 : 0);
        ls[nRows - 1] = rows + (left > nRows - 1 ? 1 : 0);
        for (int i = 1; i < nRows - 1; ++i) {
            ls[i] = 2 * rows + (left > i ? 1 : 0);
        }

        if (left - nRows > 0) {
            int t = left - nRows;
            int c = nRows - 2;
            while (t-- > 0) {
                ls[c--]++;
            }
        }

        std::vector<int> offset(nRows, 0);
        for (int i = 1; i < nRows; ++i) {
            offset[i] = offset[i-1] + ls[i-1];
        }
           for (int i = 0; i < rows; ++i) {
            for (int j = 0; j < nRows; ++j) {
                tmp[offset[j]++] = s[i*step + j];
            }

            for (int j = 0; j < nRows-2; ++j) {
                int l = nRows - 2 - j;
                tmp[offset[l]++] = s[i*step+nRows+j];
            }
        }
        for (int i = 0; i < min(left, nRows); ++i) {
            tmp[offset[i]++] = s[rows*step+i];
        }
        if (left > nRows) {
            for (int i = 0; i < left-nRows; ++i) {
                tmp[offset[nRows-2-i]++] = s[rows*step+nRows+i];
            }
        }
         return tmp;
    }

};

 又写了一遍~

class Solution {
public:
    string convert(string s, int nRows) {
        if (nRows == 1) return s;
        int len = s.size(); 
        if (len == 0) return string();
        
        int step = nRows + nRows - 2;
        int parts = len / step;
        int left = len - parts * step;
        vector<int> l(nRows, parts);
    	for (int i = 1; i < nRows - 1; i++) l[i]+=parts;
        if (left > nRows) {
            for (int i = 0; i < nRows; i++) l[i]++;
			left -= nRows;
			for (int i = nRows - 2; left >0 && i >= 0; i--, left--) l[i]++;
        } else {
			for (int i = 0; left >0 && i < nRows; i++, left--)
            l[i]++;
		}
        
        vector<int> idx(nRows, 0);
        idx[0] = 0;
        for (int i = 1; i < nRows ; i++)
            idx[i] = idx[i-1] + l[i-1];
        string res;
		res.resize(len);
        int r = 0;
        bool down = true;
        for (int i = 0; i < len; i++) {
            res[idx[r]++] = s[i];
            if (down) {
                if (r == nRows-1) {
                    r--;
                    down = false;
                }
                else r++;
            } else {
                if (r == 0) {
                    r++;
                    down = true;
                } else r--;
            }
        }
        return res;
    }
};

 

分享到:
评论

相关推荐

    LeetCode6 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) Java AC版本

    leetcode2-zigzag_conversion:代码挑战:ZigZag转换

    leetcode 2 代码挑战 之字形转换 字符串"PAYPALISHIRING"在给定的行数上以锯齿形图案书写,如下所示:(您可能希望以固定字体显示此图案以获得更好的可读性) P A H N A P L S I I G Y I R 然后逐行阅读: ...

    leetcode2sumc-leetcode_journey:挑战完整的leetcode,每周至少一题!

    Conversion,则可以生成一个空的测试文件以及一个模板代码文件ZigZag_Conversion.cpp,cpp的内容如下: #include "comm_header.h" int main() { int test_cases = input(); for (int i = 1; i &lt;= test_cases; +...

    LeetCode最全代码

    # [LeetCode](https://leetcode.com/problemset/algorithms/) ![Language](https://img.shields.io/badge/language-Python%20%2F%20C++%2011-orange.svg) [![License]...

    leetcode分类-LeetCodeSrc:力扣

    O(n)时间复杂度就可以解决###LeetCode4AddTwoNumbers简单题,注意空指针的情况和进位###LeetCode5LongestPalindromicSubstringO(N^2)的时间复杂度,不知道有没有更快的###LeetCode6ZigZagConversion边界条件一定要想...

    leetcode316-leetcode_script:leetcode题解更新脚本

    Conversion Easy -&gt; Medium 8 String to Integer (atoi) Easy -&gt; Medium 19 Remove Nth Node From End of List Easy -&gt; Medium 33 Search in Rotated Sorted Array Hard -&gt; Medium 35 Search Insert Position Medium...

    leetcode知乎-leetcode:leetcode解决方案

    leetcode 知乎 此项目介绍 此项目旨在是为leetcode里面的习题提供解析(数据结构相关知识),锻炼了自己,同时也给别人带来了方便。 网站习题链接: ** 作者知乎链接**: ...Conversion Reverse Integer Strin

    leetcode答案-leetcode:leetcode问题解决方案

    leetcode ...Conversion Medium com.bcat.algorithms.medium.ZigZagConversionSol 7 Reverse Integer Easy com.bcat.algorithms.easy.ReverseIntegerSol 8 String to Integer (atoi) Medium com.bc

    leetcode2sumc-leetcode:JavaScript版本leetcode中文版代码

    Conversion 中等 7 Reverse Integer 简单 8 String to Integer (atoi) 中等 9 Palindrome Number 简单 11 Container With Most Water 中等 12 Integer to Roman 中等 13 Roman to Integer 简单 14 Longest Common ...

    leetcode题库-LeetCode-Go:用GO回答LeetCode

    leetcode题库 LeetCode-Go 理论基础 见Note 脑图 TODO ...Conversion 37.5% Medium 0007 Reverse Integer 25.8% Easy 0008 String to Integer (atoi) 15.5% Medium 0009 Palindrome Number 49.4% Easy

    Leetcode回文串拼接-leetcode_note:用于记录leetcode题目的解析

    Conversion 7.Reverse Integer 8.String To Integer 9.Palindrome Number 10.String To Integer 11.Container With Most Water 12.Integer To Roman 13.Roman To Integer 289 347 380 442 457 Circular Array Loop ...

    分割数组求最大差值leetcode-Leetcode-Road:LeetCode刷题记录

    Conversion 45.6% 中等 7 Reverse Integer 33.2% 简单 8 String to Integer (atoi) 18.5% 中等 9 Palindrome Number 56.7% 简单 10 Regular Expression Matching 25.3% 困难 11 Container With Most Water 59.3% ...

    leetcode分类-Leetcode:cpp中的Leetcode解决方案(已解决424个)

    leetcode 分类 Leetcode 总结 (updating) # Title Solution 1 Two ...用unordered_map,降至O(n) ...一个变量存储进位,当l1,l2,进位非均为空时,继续...Conversion 7 Reverse Integer 8 String to Integer (atoi) 9 Palind

    leetcode338-LeetCode:LeetCode刷题总结

    LeetCode刷题总结 1.Two Sum 2.Add Two Numbers 3.Longest Substring Without Repeating Characters 4.Median of Two Sorted Arrays 5.Longest Palindromic Substring (Manacher算法待完成) 6.ZigZag Conversion 7....

    leetcode双人赛-LeetCode:力扣笔记

    leetcode双人赛LeetCode 编号 题目 难度 题型 备注 Two Sum 简单 Add Two Numbers 中等 链结串列 重要 Longest Substring Without Repeating Characters 中等 字串 重要 Median of Two Sorted Arrays 困难 数学 ...

    leetcode实现strstr-leetcode-js:js刷leetcode

    leetcode实现strstr leetcode-js 记录刷leetcode分析过程,...Conversion 逻辑 2019/09/13 0007 Reverse Integer 逻辑 2019/09/13 0008 String To Integer 2019/09/14 0009 Palindrome Number 双指针 2019/09/17 0010

    leetcode530-algorithm:算法

    Conversion 007 Reverse Integer 008 String to Integer (atoi) 009 Palindrome Number 010 Regular Expression Matching 011 Container With Most Water 012 Integer to Roman 013 Roman to Integer 014 Longest ...

    javalruleetcode-leetcode-solutions-java:leetcode-解决方案-java

    Conversion.java) 7 [Java](/Java/007 反向整数.java) 8 [Java](/Java/008 String to Integer (atoi).java) 9 [Java](/Java/009 回文数.java) 10 [Java](/Java/010 正则表达式匹配.java) 11 [Java](/Java/011 最多水...

    leetcode分类-LeetCode:LeetCode在线裁判C++

    ZigZag Conversion SingleNumber 其他算法 各种SingleNumber变种 LinkListCycle I II 其他变种 编程之美 Preorder Traversal Inorder Traver sal postorder 非递归 不用栈! 字符串常用操作 字符串 各种转换 Pow(x,n...

    leetcode答案-LeetCode:我的力扣解决方案

    Conversion: Find the Regulation. 11. Container With Most Water 问题简述:给出一个list a,找到一组i,j使得**min(a[i],a[j])*(j-i)**最大   思路:设置首位指针h,t 从较小的一段往中间移动,同时更新答案 12. ...

Global site tag (gtag.js) - Google Analytics