ZigZag - 曲折字符串
需求:将所给的字符串以“倒N型”输出,可以指定输出的行数
函数 String convert(String s, int numRows)
例如输入“abcdefghijklnmopqrstuvwxyz”,输出成3行;得到
a e i n q u y
bdfhjlmprtvxz
c g k o s w
下面是一个5行的例子
String s = "abcdefghijklnmopqrstuvwxyzabcdefghijklnmopqrstuvwxyzabcdefghijklnmopqrstuvwxyz";
a___i___q___y___g___o___w___e___n___u
b__hj__pr__xz__fh__mp__vx__df__lm__tv
c_g_k_o_s_w_a_e_i_n_q_u_y_c_g_k_o_s_w
df__lm__tv__bd__jl__rt__zb__hj__pr__xz
e___n___u___c___k___s___a___i___q___y
MD$}1[_C`]]M.png)
便于观察,用下划线代替空格;可以看到行末是没有空格的;
观察例子:
1.从0开始计数,第0行第0列是“a”;第4行第0列是“e”;把位于斜线的字母称为斜线位
2.完整列之间间隔为3,即5-2;对于3行的例子,间隔为1=3-2;2行的例子,间隔为0=2-2;间隔为numRows-2;
3.首行和尾行没有斜线位;观察编号,得知a到i之间间隔2*numRows-2;令zigSpace=2*numRows-2
4.对于空格数量,第0行字母之间有3个空格;第1行斜线位左边有2个空格,右边0个;
第2行斜线位左边1个空格,右边1个;第3行斜线位左边0个空格,右边2个
这里斜线位字符的位置是: 2*numRows-2 + j - 2*i(其中i为行数,j为该行第几个字符)
5.最后一列后面不再添加空格,可用游标是否越界来判断
代码中convertOneLine将结果成从左到右读成一行
/**
* @author Rust Fisher
* @version 1.0
*/
public class ZigZag {
/**
* @param s
* @param numRows
* @return The string that already sort
*/
public static String convert(String s, int numRows) {
if (numRows <= 1 || s.length() < numRows || s.length() < 3) {
return s;
}
String strResult = "";
int zigSpace = 2*numRows - 2;
int zig = numRows - 2;
for (int i = 0; i < numRows; i++) {
for (int j = i; j < s.length(); j+=zigSpace) {
strResult = strResult + s.charAt(j);
if (i != 0 && i != numRows - 1 && (zigSpace + j - 2*i) < s.length()) {
for (int inner = 0; inner < zig - i; inner++) {
strResult += " ";
}
strResult = strResult + s.charAt(zigSpace + j - 2*i);
if ((2*zigSpace + j - 2*i) <= s.length()/*true*/) {//control the final word of string
for (int inner = 0; inner < i - 1; inner++) {
strResult += " ";
}
}
} else {
if (j+zigSpace < s.length()) {//control the final word of per line
for (int outline = 0; outline < zig; outline++) {
strResult += " ";
}
}
}
}
if (i < numRows - 1) {
strResult += "\n";
}
}
return strResult;
}
/**
* @param s
* @param numRows
* @return one line String
*/
public static String convertOneLine(String s, int numRows) {
if (numRows <= 1 || s.length() < numRows || s.length() < 3) {
return s;
}
String strResult = "";
int zigSpace = 2*numRows - 2;
for (int i = 0; i < numRows; i++) {
for (int j = i; j < s.length(); j+=zigSpace) {
strResult = strResult + s.charAt(j);
if (i != 0 && i != numRows - 1 && (zigSpace + j - 2*i) < s.length()) {
strResult = strResult + s.charAt(zigSpace + j - 2*i);
}
}
}
return strResult;
}
public static void main(String args[]){
String s = "abcdefghijklnmopqrstuvwxyzabcdefghijklnmopqrstuvwxyzabcdefghijklnmopqrstuvwxyz";
String ss = "abcdefghijklnmopqrstuvwxyz";
System.out.println(convert(ss,3));
System.out.println(convertOneLine(ss,3));
System.out.println();
System.out.println(convert(s,5));
System.out.println(convertOneLine(s,5));
}
}
输出:
a e i n q u y
bdfhjlmprtvxz
c g k o s w
aeinquybdfhjlmprtvxzcgkosw
a i q y g o w e n u
b hj pr xz fh mp vx df lm tv
c g k o s w a e i n q u y c g k o s w
df lm tv bd jl rt zb hj pr xz
e n u c k s a i q y
aiqygowenubhjprxzfhmpvxdflmtvcgkoswaeinquycgkoswdflmtvbdjlrtzbhjprxzenucksaiqy

但不得不说明的是,上面这种方法太慢了。在网上查到了另一个方法,Java代码如下:
public String convert(String s, int numRows) {
if (s == null || numRows < 1) return null;
if (numRows == 1) return s;
char[] ss = s.toCharArray();
StringBuilder[] strings = new StringBuilder[numRows];
for (int i = 0; i < strings.length; i++) {
strings[i] = new StringBuilder();
}
int zigNum = 2 * numRows - 2;
for (int i = 0; i < s.length(); i++) {
int mod = i % zigNum;
if (mod >= numRows) {
strings[2*numRows - mod - 2].append(ss[i]);
}
else {
strings[mod].append(ss[i]);
}
}
for (int i = 1; i < strings.length; i++) {
strings[0].append(strings[i].toString());
}
return strings[0].toString();
}
利用了StringBuilder类来构建String
ZigZag - 曲折字符串的更多相关文章
- Leetcode 6 ZigZag Conversion 字符串处理
题意:将字符串排成Z字形. PAHNAPLSIIGYIR 如果是5的话,是这样排的 P I AP YR H L G N SI A I 于是,少年少女们,自己去找规律吧 提示:每个Z ...
- [leetcode]6. ZigZag Conversion字符串Z形排列
The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like ...
- LeetCode 6. ZigZag Conversion & 字符串
ZigZag Conversion 看了三遍题目才懂,都有点怀疑自己是不是够聪明... 就是排成这个样子啦,然后从左往右逐行读取返回. 这题看起来很简单,做起来,应该也很简单. 通过位置计算行数: P ...
- Java [leetcode 6] ZigZag Conversion
问题描述: The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows ...
- News common vocabulary
英语新闻常用词汇与短语 经济篇 accumulated deficit 累计赤字 active trade balance 贸易顺差 adverse trade balance 贸易逆差 aid 援助 ...
- LeetCode解题录-1~50
[leetcode]1. Two Sum两数之和 Two Pointers, HashMap Easy [leetcode]2. Add Two Numbers两数相加 Math, LinkedLis ...
- 理解StringBuilder
StringBuilder objects are like String objects, except that they can be modified. Internally, these o ...
- [LeetCode] ZigZag Converesion 之字型转换字符串
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 ...
随机推荐
- java中File类应用:遍历文件夹下所有文件
练习: 要求指定文件夹下的所有文件,包括子文件夹下的文件 代码: package 遍历文件夹所有文件; import java.io.File; public class Test { public ...
- SSO框架介绍前篇
SSO全程是single sign on,即单点登录,是一种统一认证和授权机制. 单点登录,指访问同一服务器不同应用中的受保护资源的同一用户,只需要登录一次,即通过一个应用中的安全验证后,再访问其 ...
- Floyd判圈算法
Floyd判圈算法 leetcode 上 编号为202 的happy number 问题,有点意思.happy number 的定义为: A happy number is a number defi ...
- javaCV开发详解之4:转流器实现(也可作为本地收流器、推流器,新增添加图片及文字水印,视频图像帧保存),实现rtsp/rtmp/本地文件转发到rtmp流媒体服务器(基于javaCV-FFMPEG)
javaCV系列文章: javacv开发详解之1:调用本机摄像头视频 javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG.j ...
- Python3实现简单的http server
前端的开发的html给我们的时候,由于内部有一些ajax请求的.json的数据,需要在一个web server中查看,每次放到http服务器太麻烦.还是直接用python造一个最方便. 最简单的,直接 ...
- JQ封装图片预加载插件
我们知道,图片的加载,特别是资源较大的图片,加载相当耗费时间.为了提高用户体验,不得不使用图片预加载技术来提前加载,以提高用户在浏览时的流畅度. 先来弄明白图片的懒加载和预加载的不同: 1)概念:懒加 ...
- Python中如何调用Linux命令
一.使用os模块 In [1]: import os #导入os模块 In [2]: os.system('ls') anaconda-ks.cfg epel-release-7-5.noarch.r ...
- rem的js
html { font-size : 20px; } @media only screen and (min-width: 401px){ html { font-size: 25px !import ...
- asp.net web api实现图片点击式图片验证码
现在验证码的形式越来越丰富,今天要实现的是在点击图片中的文字来进行校验的验证码,如图 这种验证码验证是验证鼠标是否选中了图片中文字的位置,以及选择的顺序,产生验证码的时候可以提供一组底图,然后随机获取 ...
- zend framework 1 安装教程
网上的安装教程总是一笔带过,本人结合已经爬过的坑,为大家展示最简单的安装方式: 博主环境如下: 操作系统:win7 64bit 开发环境:lnmp(phpstudy) 注意: zftest:官方下载的 ...