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字节byte操作,处理Java基本数据的转换及进制转换操作工具,流媒体及java底层开发项目常用工具类
前言:用于处理Java基本数据的转换及进制转换操作工具 一.实现功能 1.int与byte互转 2.int与byte[]互转 3.short与byte互转 4.short与byte[]互转 5.16位 ...
- 通过JSP+servlet实现文件上传功能
在TCP/IP中,最早出现的文件上传机制是FTP.它将文件由客户端到服务器的标准机制. 但是在JSP中不能使用FTP来上传文件,这是有JSP的运行机制所决定的. 通过为表单元素设置Method=&qu ...
- DISCUZ积分及点评需求
1.点评设置(可增强用户互动,但又不会顶帖刷屏):目前很难限制用户通过点评刷积分,点评等同于回复但却不需要审核,目前只是简单地关闭了点评功能.需求:可以审核点评内容:可以限制点评不获得积分或每天点评获 ...
- 为什么多线程、junit 中无法使用spring 依赖注入?
为什么多线程.junit 中无法使用spring 依赖注入? 这个问题,其实体现了,我们对spring已依赖太深,以至于不想自己写实例了. 那么到底是为什么在多线程和junit单元测试中不能使用依赖注 ...
- mysql中group by和order by同时使用无效的替代方案
前言 最近一年由于工作需要大部分使用的都是NoSql数据库,对关系型数据库感觉越来越陌生,一个由group by和order by 引发的血案由此而生.在此做个记录,以备不时之需. 需求 首先,看一下 ...
- oracle创建数据库表空间 用户 授权 导入 导出数据库
windows下可以使用向导一步一步创建数据库,注意编码. windows连接到某一个数据库实例(不然会默认到一个实例下面):set ORACLE_SID=TEST --登录开始创建表空间及可以操作的 ...
- img如果没有图片显示默认图片效果
img如果没有图片显示默认图片效果<img src="本来要显示的图片URL" onerror="this.src='图片挂了的话要显示的默认图片URL'" ...
- my97自定义事件
onFocus="WdatePicker({onpicked:function(){alert(0);}})"
- php产生随机字符串
/** * 产生随机字符串 * * @param int $length 输出长度 * @param string $chars 可选的 ,默认为 0123456789 * @return strin ...
- 【Android Developers Training】 40. 序言:通过NFC共享文件
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...