LeetCode | 6. ZigZag Conversion(之字形变换)
2017-04-03 01:21
295 查看
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)
And then read line by line: “PAHNAPLSIIGYIR”
Write the code that will take a string and make this conversion given a number of rows:
convert(“PAYPALISHIRING”, 3) should return “PAHNAPLSIIGYIR”.
解题思路:两种.最初想到的是开一个数组,每次像蛇形矩阵一样对数组赋值,最后对每一行每一列遍历,提取出不是空的字符.125ms,几乎是所有题叫中所有提交中最慢的之一了.
第二种,找规律,直接按0~r行,空间复杂度为O(1).29ms(参考LeetCode代码)
虽然这两个算法的复杂度都是O(n),时间差别还挺大.
/*n=numRows
Δ=2n-2 1 2n-1 4n-3
Δ= 2 2n-2 2n 4n-4 4n-2
Δ= 3 2n-3 2n+1 4n-5 .
Δ= . . . . .
Δ= . n+2 . 3n .
Δ= n-1 n+1 3n-3 3n-1 5n-5
Δ=2n-2 n 3n-2 5n-4
*/
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”.
解题思路:两种.最初想到的是开一个数组,每次像蛇形矩阵一样对数组赋值,最后对每一行每一列遍历,提取出不是空的字符.125ms,几乎是所有题叫中所有提交中最慢的之一了.
第二种,找规律,直接按0~r行,空间复杂度为O(1).29ms(参考LeetCode代码)
虽然这两个算法的复杂度都是O(n),时间差别还挺大.
/*n=numRows
Δ=2n-2 1 2n-1 4n-3
Δ= 2 2n-2 2n 4n-4 4n-2
Δ= 3 2n-3 2n+1 4n-5 .
Δ= . . . . .
Δ= . n+2 . 3n .
Δ= n-1 n+1 3n-3 3n-1 5n-5
Δ=2n-2 n 3n-2 5n-4
*/
//125ms class Solution { public: string convert(string s, int r) { int len = s.length(); string res = ""; if (r == 1) return s; else if (r == 2) { for (int i = 0; i < len; i += 2) res += s[i]; for (int j = 1; j < len; j += 2) res += s[j]; return res; } char chess[1000][1000] = {}; for (int i = 0; i < r; i++) for (int j = 0; j < len; j++) chess[i][j] = ' ';//初始化 int it = 0, row = 0, col = 0; while (it < len) { chess[row][col] = s[it]; if (row == 0) row++; else if (row == r - 1) { row--; col++; } else if (col % (r - 1) == 0) row++; else { row--; col++; } it++; } for (int i = 0; i < r; i++) for (int j = 0; j <= col; j++) if (chess[i][j] != ' ') res += chess[i][j]; return res; } };
//29ms class Solution { public: string convert(string s, int r) { string result = ""; if (r == 1) return s; int step1, step2; int len = s.size(); for (int i = 0; i<r; ++i) { step1 = (r - i - 1) * 2; step2 = (i) * 2; int pos = i; if (pos<len) result += s[pos]; while (1) { pos += step1; if (pos >= len) break; if (step1) result += s[pos]; pos += step2; if (pos >= len) break; if (step2) result += s[pos]; } } return result; } };
相关文章推荐
- 【LeetCode】之字形变换
- Leetcode 127. Word Ladder 字符变换 解题报告
- [LeetCode] Edit Distance 字符串变换为另一字符串动态规划
- [LeetCode]103. Binary Tree Zigzag Level Order Traversal--二叉树之字形遍历
- [LeetCode] 103. Binary Tree Zigzag Level Order Traversal 二叉树的之字形层序遍历
- [LeetCode] Zigzag Iterator 之字形迭代器
- leetcode解题之127. Word Ladder Java版 (单词等长变换)
- LeetCode 281. Zigzag Iterator(之字形迭代器)
- LeetCode-Z字形转换
- 【LeetCode】72. Edit Distance单词变换的最少操作
- LeetCode ZigZag Conversion 打印之字形字符图案 带打印程序
- leetcode【第七周】Z字形排序字符串
- [LeetCode] Binary Tree Zigzag Level Order Traversal 二叉树的之字形层序遍历
- Leetcode 6. Z字形转换
- LeetCode 6. ZigZag Conversion--字符串按之字形放置,然后横向顺序输出
- leetCode 103.Binary Tree Zigzag Level Order Traversal (二叉树Z字形水平序) 解题思路和方法
- [LeetCode] Sort Transformed Array 变换数组排序
- LeetCode 103. Binary Tree Zigzag Level Order Traversal(二叉树之字形遍历)
- 【LeetCode笔记】Binary Tree Zigzag Level Order Traversal 二叉树Z字形遍历
- 【LeetCode-面试算法经典-Java实现】【103-Binary Tree Zigzag Level Order Traversal(二叉树分层Z字形遍历)】