Q6:ZigZag Conversion
6. ZigZag Conversion
官方的链接:6. ZigZag Conversion
Description :
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"
.
问题描述
Z型转换输出转换后的字符串
思路
方法一、参考官网
这也是比较容易理解的,建立numRows个字符串,然后遍历原字符串,对数组正数和倒数,逐个把字符按照规则添加到这些字符串数组中,最后合并。
方法二、不建立数组,直接根据规则一行一行拼接字符串。
1、Z型走法,一组总共是n = numRows + numRows - 2,即n个字符
2、从第0行开始计数,记为第row行,第0行和最后一行numRows-1的规则比较好确认:n * j + row即为第row所有的字符,j从0开始,直到n * j + row临界,row行共有j个字符
3、其他行的字符,除了上面的记录字符,在不会越界的情况下,还会多一个连接的字符,这个字符的下标可以这样计算:(j + 1) * n - row,其实(j + 1) * n是下一组的开头,减去当前的行数row,即可得到下一个字符,比如上面的例子,row=1,j=0,下一组的字符是A(第一行的第2个字符)(如下图),计算出来的下标3,即P(第2行第2个字符)(如下图),合并。
public class Q6_ZigZagConversion {
public String convert(String s, int numRows) {
if (numRows == 1) {
return s;
}
int n = numRows + numRows - 2, len = s.length();
StringBuilder result = new StringBuilder();
for (int row = 0; row < numRows; row++) {
int j = 0, headIndex = j * n + row, tailIndex = (j + 1) * n - row;
while (headIndex < len) {
result.append(s.charAt(headIndex));
j++;
headIndex = j * n + row;
if (row != 0 && row != numRows - 1 && tailIndex < len) {
result.append(s.charAt(tailIndex));
tailIndex = (j + 1) * n - row;
}
}
}
return result.toString();
} public static void main(String[] args) {
Q6_ZigZagConversion s = new Q6_ZigZagConversion();
System.out.println(s.convert("PAYPALISHIRING", 3));
}
}
最新文章
- FineReport关于tomcat集群部署的方案
- git .gitignore
- 2014.1.23 Discuz论坛迁移+VPS配置手记
- 4.“写程序” 这个活动大多数情况下是个人行为。 我们听说的优秀程序员似乎都是单打独斗地完成任务。同学们在大学里也认识一些参加ACM 比赛的编程牛人, 他们写的ACM 比赛的程序是软件么? “写程序” 和 ”做软件“ 有区别么? 请采访这些学生。
- androidstudio构建(或导入)工程(不用gradle)
- PHPCMS实现文章置顶功能的方法
- python初探-copy
- 使用Android简单实现有道电子词典
- background-size (设置背景图片的大小)
- 利用lsof恢复进程占用的文件
- ifconfig: command not found(CentOS 7,其他的可以参考)
- 最大获利 HYSBZ - 1497 (最大权闭合图)
- sparkSQL实际应用
- 哈夫曼编码(Huffman coding)的那些事,(编码技术介绍和程序实现)
- iphone设置fiddler代理测试
- linux文件系统初始化过程(2)---挂载rootfs文件系统
- 计算机网络-将C网192.168.25.0划分四个子网,计算每个子网的有效IP地址范围和对应网络掩码
- 图像的降采样与升采样(二维插值)----转自LOFTER-gengjiwen
- c# 给button添加不规则的图片以及用pictureBox替代button响应点击事件
- Android中的数据存储(二):文件存储 2017-05-25 08:16 35人阅读 评论(0) 收藏