问题描述:
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/
问题分析
这个问题看起来比较简单,但是往往在开始分析的时候却找不到思路。按照原文的描述,我们是希望将字符串组织成之字形的方式来分布,然后再按照平行的行方式来取元素。 以问题描述中的字符串遍历方式为例,假设有字符串"abcdefg"并且排成3行,那么按照原来从头到尾遍历的话它们应该按照下图的方式进行:
从上图中可以看到,之字形遍历的顺序是首先从上到下的走。然后再从下到上,不过从下到上遍历有一个特点,就是它往上的第一个元素其实是比前一列的元素要往上一行,同时它也不会到最上面那一行。所以在一些特殊情况比如说行数为1, 2的时候,它们实际上根本就不能够形成一个向上的回路。针对这些情况,它们就相当于是一组组从上往下的元素排列。比如行数为2的时候,它们实际上就是这么一个样式:
再进一步来看,针对这种排列之后,希望最终返回的结果是按照从上到下的顺序一行行返回结果。假设以4行为例的话,我们取这些元素的方式则如下图:
按照这个顺序得到的串是"agbfhceid"。所以如果要实现上述的过程,该怎么做呢?从前面的讨论中,我们可以声明一个给定行数的数组。数组里的每个元素可以在之字形遍历到的时候添加给定的字符。所以可以声明一个StringBuilder的数组。
之字形遍历的过程则需要注意从上往下和从下往上的差别。另外,不管在向上还是向下遍历的时候要判断访问的元素是否已经到头了。所以根据上述的讨论可以得到如下的代码:
public class Solution { public String convert(String s, int nRows) { char[] c = s.toCharArray(); StringBuilder[] builders = new StringBuilder[nRows]; for(int i = 0; i < nRows; i++) builders[i] = new StringBuilder(); int i = 0, len = s.length(); while(i < len) { for(int j = 0; j < nRows && i < len; j++) builders[j].append(c[i++]); for(int j = nRows - 2; j >= 1 && i < len; j--) builders[j].append(c[i++]); } for(int j = 1; j < builders.length; j++) builders[0].append(builders[j]); return builders[0].toString(); } }
总结
这个问题中间比较难构造的就是要理解之字形遍历的过程。从上往下和从下往上的时候访问的元素的索引不一样。而且用一个StringBuilder数组来作为数据结构是一个比较理想的选择。
相关推荐
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版本
c c语言_leetcode 0006_zigzag_conversion.zip
leetcode 2 代码挑战 之字形转换 字符串"PAYPALISHIRING"在给定的行数上以锯齿形图案书写,如下所示:(您可能希望以固定字体显示此图案以获得更好的可读性) P A H N A P L S I I G Y I R 然后逐行阅读: ...
leetcode 知乎 此项目介绍 此项目旨在是为leetcode里面的习题提供解析(数据结构相关知识),锻炼了自己,同时也给别人带来了方便。 网站习题链接: ** 作者知乎链接**: ...Conversion Reverse Integer Strin
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
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....
6. **Z字形变换 (06 Zigzag Conversion)**:此题涉及到字符串处理和模拟。给定一个字符串,按照“Z”字形排列,即奇数位置的字符按顺序排列,偶数位置的字符逆序排列。这个问题可以通过迭代或递归方法实现。 这些...
leetcode 2sum # Programming-Problems This will have many problems ...Conversion [Medium] LC7: Reverse Integer [Easy] LC8: String To Integer Atoi [Medium] LC9: Palindrome Number [Easy] LC11:
ZigZag Conversion SingleNumber 其他算法 各种SingleNumber变种 LinkListCycle I II 其他变种 编程之美 Preorder Traversal Inorder Traver sal postorder 非递归 不用栈! 字符串常用操作 字符串 各种转换 Pow(x,n...
leetcode双人赛LeetCode 编号 题目 难度 题型 备注 Two Sum 简单 Add Two Numbers 中等 链结串列 重要 Longest Substring Without Repeating Characters 中等 字串 重要 Median of Two Sorted Arrays 困难 数学 ...
Conversion: Find the Regulation. 11. Container With Most Water 问题简述:给出一个list a,找到一组i,j使得**min(a[i],a[j])*(j-i)**最大 思路:设置首位指针h,t 从较小的一段往中间移动,同时更新答案 12. ...
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 ...
0006_ZigZag_Conversion 0007_Reverse_Integer 0008_String_to_Integer_atoi 0009_Palindrome_Number 0010_Regular_Expression_Matching 0011_Container_With_Most_Water 0012_Integer_to_Roman 0013_Roman_to_...
leetcode 分类 Leetcode 总结 (updating) # Title Solution 1 Two ...用unordered_map,降至O(n) ...一个变量存储进位,当l1,l2,进位非均为空时,继续...Conversion 7 Reverse Integer 8 String to Integer (atoi) 9 Palind
leetcode 跳跃 leetcode 按题型标签,记录leetcode 解题之路 Stack 栈 [0020 有效的括号](./Stack/valid-parentheses.md) ...Z字形变换](./String/zigzag-conversion.md) [0030 串联所有单词的子串](./String/substring
leetcode1两数之和 Leetcode Leetcode1_100 1. ...ZigZagConversion 7. 数字反转 ReverseInteger 8. 字符串转数字 StringtoInteger 9. 回文数 PalindromeNumber 10. 正则匹配 RegularExpressionMatch
java入门 java_leetcode题解之006_ZigZag_Conversion
./0006-zigzag-conversion.cpp ./0007-reverse-integer.cpp ./0008-string-to-integer-atoi.cpp ./0009-palindrome-number.cpp ./0010-regular-expression-matching.cpp ./0011-container-with-most-water.cpp ./...
c语言入门 C语言_leetcode题解之06-zigzag-conversion.c
js js_leetcode题解之6-zigzag-conversion.js