Leetcode:ZigZag Conversion分析和实现
问题的大意就是将字符串中的字符按锯齿状(倒N形)垂直由上向下放置,最后水平从左向右读取。比如
ABCDEFGHIJKLMN,4表示
A G M
B F H L N
C E I K
D J
按水平顺序读取的结果则为AGMBFHLNCEIKDJ。(原题目的描述就很有问题)
解决方案非常简单,可以发现字符串中第i个字符,其水平右边最近的元素为i+2*(row-1),其中row为规定的行高。而除了第一行和最后一行,中间的行的处理逻辑是一致的,而首行和尾行的处理逻辑也是一致的。
res = ""
step = 2 * (row - 1)
//处理首行
for(int i = 0; i < s.length; i = i + step)
res = res + s[i]
//处理第1~row-2行
for(int i = 1; i< row - 1; i = i + 1)
//添加处于垂直列中的元素,如果有必要还要添加中间斜线上的元素
for(int j = i; j < s.length; j = j + step)
res = res + s[j]
if(j + step - i * 2 < s.length)
res = res + s[j + step - i * 2]
//处理尾行
for(int i = row - 1; i < s.length; i = i + step)
res = res + s[i]
由于每次循环体内的有效代码的执行都会将结果的长度增加1,但是结果的长度必定与s的长度一致,因此循环体最多只会执行s.length次,记n=s.length,因此这段代码的时间复杂度和空间复杂度均为O(n)。
最后惯例附上代码:

package cn.dalt.leetcode;
/**
* Created by dalt on 2017/6/9.
*/
public class ZigZagConversion {
public String convert(String s, int numRows) {
int slen = s.length();
if (numRows == 1) {
return s;
}
StringBuilder sb = new StringBuilder(slen);
int totalstep = numRows + numRows - 2;
//The first line
for (int i = 0, bound = slen; i < bound; i += totalstep) {
sb.append(s.charAt(i));
}
//The following line
for (int i = 1, iBound = numRows - 1; i < iBound; i++) {
int step = totalstep - i * 2;
for (int j = i, jBound = slen; j < jBound; j += totalstep) {
sb.append(s.charAt(j));
if (j + step < jBound) {
sb.append(s.charAt(j + step));
}
}
}
//The last line
for (int i = numRows - 1, iBound = slen; i < iBound; i += totalstep) {
sb.append(s.charAt(i));
}
return sb.toString();
}
}
Leetcode:ZigZag Conversion分析和实现的更多相关文章
- 6.[leetcode] ZigZag Conversion
The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like ...
- LeetCode ZigZag Conversion(将字符串排成z字型)
class Solution { public: string convert(string s, int nRows) { string a=""; int len=s.leng ...
- LeetCode: ZigZag Conversion 解题报告
ZigZag ConversionThe string "PAYPALISHIRING" is written in a zigzag pattern on a given num ...
- [leetcode]ZigZag Conversion @ Python
原题地址:https://oj.leetcode.com/problems/zigzag-conversion/ 题意: The string "PAYPALISHIRING" i ...
- [LeetCode]ZigZag Conversion
The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like ...
- LeetCode——ZigZag Conversion
The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like ...
- [LeetCode] ZigZag Conversion [9]
称号 The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows li ...
- C++ leetcode::ZigZag Conversion
mmp,写完没保存,又得重新写.晚上写了简历,感觉身体被掏空,大学两年半所经历的事,一张A4纸都写不满,真是一事无成呢.这操蛋的生活到底想对我这个小猫咪做什么. 今后要做一个早起的好宝宝~晚起就诅咒自 ...
- leetcode题解 6.ZigZag Conversion
6.ZigZag Conversion 题目: The string "PAYPALISHIRING" is written in a zigzag pattern on a gi ...
随机推荐
- *android判断手机号的运营商
TextView tv=(TextView)findViewById(R.id.tv); TelephonyManager telManager = (TelephonyManager) getSys ...
- 9.proc目录下的文件和目录详解
1./proc目录下的文件和目录详解 /proc:虚拟目录.是内存的映射,内核和进程的虚拟文件系统目录,每个进程会生成1个pid,而每个进程都有1个目录. /proc/Version:内核版本 /pr ...
- svg实现 圆形 点击扩大、消失
效果: 代码: <!DOCTYPE html> <html> <head lang="en"> <meta charset="U ...
- 打印机无法使用且无法重新安装,提示spooler service is not running
使用场景:之前安装好的打印服务今天突然无法使用,列表里面找不到打印机,于是重新安装,得到以下错误: The local print spooler service is not running. Pl ...
- ADO.Net入门(2)
(转载) 作者:可米小子 出处:http://liuhaorain.cnblogs.com 1. 什么是连接池? 在上篇文章<你必须知道的ADO.NET(四) 品味Connection对象> ...
- [EMWIN]关于 GUI_GetPixelIndex 使用的问题
在模拟器上和st单片机上使用以下代码: GUI_COLOR color0,color1; color0 = GUI_GetPixelIndex(rect.x1+1, rect.y0);color1 = ...
- httpwebrequest webrequest webresponse 总结
http://blog.csdn.net/flymorn/article/details/6769722 使用,总结,深入,全通,指正
- 【策略】一致性Hash算法(Hash环)的java代码实现
[一]一致性hash算法,基本实现分布平衡. package org.ehking.quartz.curator; import java.util.SortedMap; import java.ut ...
- UVA10674 Tangents
题意 PDF 分析 就是圆的切线的模板. 注意精度问题,排序的时候也不能直接写,被卡了好几次. 时间复杂度\(O(T)\) 代码 #include<iostream> #include&l ...
- 初识用.NET Remoting来开发分布式应用
一..NET Remoting简介: .NET Remoting从某种意义上讲是DCOM的替代品.ASP.NET Web服务十分有用,但是这项技术在企业内联网的解决方案中,对于某些业务请求来说并不快, ...