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

这道题就是看坐标的变化,找规律并分块处理。参考:爱做饭的小莹子

规律:第一行和最后一行,就是按照2n-2的顺序一点点加的。斜着那条线的字的位置是当前列j+(2n-2)-2i(i是行的index)。

Java:

public String convert(String s, int nRows) {
if(s == null || s.length()==0 || nRows <=0)
return "";
if(nRows == 1)
return s; StringBuilder res = new StringBuilder();
int size = 2*nRows-2;
for(int i=0;i<nRows;i++){
for(int j=i;j<s.length();j+=size){
res.append(s.charAt(j));
if(i != 0 && i != nRows - 1){//except the first row and the last row
int temp = j+size-2*i;
if(temp<s.length())
res.append(s.charAt(temp));
}
}
}
return res.toString();
}

Python:

class Solution(object):
def convert(self, s, numRows):
"""
:type s: str
:type numRows: int
:rtype: str
"""
if numRows == 1:
return s
step, zigzag = 2 * numRows - 2, ""
for i in xrange(numRows):
for j in xrange(i, len(s), step):
zigzag += s[j]
if 0 < i < numRows - 1 and j + step - 2 * i < len(s):
zigzag += s[j + step - 2 * i]
return zigzag

C++:

class Solution {
public:
string convert(string s, int nRows) {
if (nRows <= 1) return s;
string res = "";
int size = 2 * nRows - 2;
for (int i = 0; i < nRows; ++i) {
for (int j = i; j < s.size(); j += size) {
res += s[j];
int tmp = j + size - 2 * i;
if (i != 0 && i != nRows - 1 && tmp < s.size()) res += s[tmp];
}
}
return res;
}
};

  

  

All LeetCode Questions List 题目汇总

  

最新文章

  1. linux命令大全之ln命令详解(创建软链接和硬链接)
  2. NET基础(4):引用类型和值类型
  3. 浅谈HTTP中Get与Post的区别(转)
  4. Tcc学习笔记(一) 开篇
  5. VC++ 6.0使用定时器SetTimer;
  6. POJ 1503
  7. 【Unity Shaders】学习笔记——SurfaceShader(一)认识结构
  8. C# 时间戳
  9. [置顶] stax解析xml文档的6种方式
  10. Shell学习笔记 - 运算符
  11. zendstudio正则匹配查询
  12. Android应用程序中的多个Activity的显示创建和调用
  13. XSS漏洞的分类
  14. Android下拉刷新上拉载入控件,对全部View通用!
  15. openWRT自学---自己编译的第一个 backfire10.03 版本的过程记录(转)
  16. springmvc框架下ajax请求传参数中文乱码解决
  17. C++ for循环语句
  18. Effective Java 第三版笔记(目录)
  19. 转://Oracle补丁及opatch工具介绍
  20. 剑指 offer 面试题31 连续子数组的最大和(动态规划)

热门文章

  1. python3学习之lambda+sort
  2. Python 简单批量请求接口实例
  3. easyui_验证扩展
  4. jq function return value
  5. vue cli 框架搭建
  6. 【Selenium-WebDriver实战篇】ScreenRecorder的实际输出路径,自己的解决方案
  7. Linux端口转发工具rinetd
  8. [Algorithm] BFS vs DFS
  9. LeetCode 1043. Partition Array for Maximum Sum
  10. MySQL 开启远程链接(localhost 以外的主机)