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个字符)(如下图),合并。

[github-here]

 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));
}
}

最新文章

  1. FineReport关于tomcat集群部署的方案
  2. git .gitignore
  3. 2014.1.23 Discuz论坛迁移+VPS配置手记
  4. 4.“写程序” 这个活动大多数情况下是个人行为。 我们听说的优秀程序员似乎都是单打独斗地完成任务。同学们在大学里也认识一些参加ACM 比赛的编程牛人, 他们写的ACM 比赛的程序是软件么? “写程序” 和 ”做软件“ 有区别么? 请采访这些学生。
  5. androidstudio构建(或导入)工程(不用gradle)
  6. PHPCMS实现文章置顶功能的方法
  7. python初探-copy
  8. 使用Android简单实现有道电子词典
  9. background-size (设置背景图片的大小)
  10. 利用lsof恢复进程占用的文件
  11. ifconfig: command not found(CentOS 7,其他的可以参考)
  12. 最大获利 HYSBZ - 1497 (最大权闭合图)
  13. sparkSQL实际应用
  14. 哈夫曼编码(Huffman coding)的那些事,(编码技术介绍和程序实现)
  15. iphone设置fiddler代理测试
  16. linux文件系统初始化过程(2)---挂载rootfs文件系统
  17. 计算机网络-将C网192.168.25.0划分四个子网,计算每个子网的有效IP地址范围和对应网络掩码
  18. 图像的降采样与升采样(二维插值)----转自LOFTER-gengjiwen
  19. c# 给button添加不规则的图片以及用pictureBox替代button响应点击事件
  20. Android中的数据存储(二):文件存储 2017-05-25 08:16 35人阅读 评论(0) 收藏

热门文章

  1. Day5-T4
  2. xcode windows版安装使用教程
  3. pytesseract 识别率低提升方法
  4. leetcode1161 Maximum Level Sum of a Binary Tree
  5. leetcode102 Binary Tree Level Order Traversal
  6. ACM-寻宝
  7. poj 1027 Ignatius and the Princess II全排列
  8. 09 MySQL字符集
  9. 云服务器CentOS7系统环境配置(jdk和tomcat)
  10. 【pwnable.kr】 codemap