每天一题LeetCode【第1天】

T6. ZigZag Conversion 【Easy

题目

把字符串 "PAYPALISHIRING" 用ZiaZag(曲折)的形式,在给定的数字(很据后面我推测它这里指的是3)下表示如下

P   A   H   N
A P L S I I G
Y   I   R

然后对它一行行读取,就变成了 "PAHNAPLSIIGYIR"

写如下的一个方法,传参一个String和一个int,返回一个string:

string convert(string text, int nRows);

如果执行方法 convert("PAYPALISHIRING", 3) ,应该返回 "PAHNAPLSIIGYIR"

代码

代码参考 Top Solution,稍作注释

public String convert(String s, int nRows) {
    //转化成char字符数组方便后面使用
    char[] c = s.toCharArray();
    //得到输入的字符数量
    int len = c.length;
    //用StringBuffer,后面详说
    StringBuffer[] sb = new StringBuffer[nRows];
    for (int i = 0; i < sb.length; i++) sb[i] = new StringBuffer();
    int i = 0;
    //关键代码,通过i++一个个读完
    while (i < len) {
        for (int idx = 0; idx < nRows && i < len; idx++) // vertically down
            sb[idx].append(c[i++]);
        for (int idx = nRows-2; idx >= 1 && i < len; idx--) // obliquely up
            sb[idx].append(c[i++]);
    }
    //把几行并到一起,然后输出
    for (int idx = 1; idx < sb.length; idx++)
        sb[0].append(sb[idx]);
    return sb[0].toString();
}

思路

把事例的那个文字输入我觉得换成下面那样更容易理解(因为这样看上下看着对称感觉不会造成不必要的误解吧)

P   A   H   N
 A P L S I I G
  Y   I   R
  • 把输入转成char字符数组,可以方便提取每一个字符,以及得到总字符长度
  • 用StringBuffer(下有补充)和i++来一个个用V字型读取,其中控制条件idx++是向下读取,idx--是向上读取
  • 最后把几个StringBuffer(各代表一行)并到一起输出

补充

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,767评论 18 399
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 11,178评论 6 13
  • (一)Java部分 1、列举出JAVA中6个比较常用的包【天威诚信面试题】 【参考答案】 java.lang;ja...
    独云阅读 7,142评论 0 62
  • 1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?答:可以有多个类,但只能有一个publ...
    岳小川阅读 961评论 0 2
  • “宁昊,你怎么流鼻血了?谁打的。” “哥哥,你怎么了,快去医院。” 赵茗敏和宁萝刚好从一片竹林里转出来,看到宁昊这...
    可可豆子阅读 213评论 0 5