写在前面,参考的是力扣官网的画解算法
一、java代码
/*
* @lc app=leetcode.cn id=6 lang=java
*
* [6] Z 字形变换
*/
// @lc code=start
class Solution {
public String convert(String s, int numRows) {
//特别的,如果numrows=1则表示当前字符串即为结果
if(numRows==1)
return s;
//判断字符串的数组会不会比给定的行数小
int len=Math.min(s.length(),numRows);
//发现StringBuilder 被当做array来使用,
//StringBuilder[]相当于array of array
//要按row来进行遍历,每一个row先allocate一个StringBuilder
String []rows=new String[len];
//先为每一个row赋空
for(int i=0;i<len;i++) rows[i]="";
//定义down,loc
//loc表示当前字符串数组的下标
int loc=0;
//表示是否向下,在第0行和第numRows-1行要变向
boolean down=false;
//遍历给定的字符串
for(int i=0;i<s.length();i++){
//将当前字符加入当前字符串中
rows[loc]+=s.substring(i,i+1);
//考虑给down变向
if(loc==0||loc==numRows-1)
down=!down;
//判断loc是+还是-
loc+=down?1:-1;
}
//最终要输出的结果,先赋空
String ans="";
//循环遍历每一行的row,都加到要输出的结果中
for(String row:rows){
ans+=row;
}
return ans;
}
}
// @lc code=end
二、字符串思路分析
整体思路
遍历字符串,遍历过程中将每行都看成新的字符串构成字符串数组,最后将该数组拼接起来即可
特别说明
numrows
如果numrows=1,则说明当前字符串即为结果,直接返回
否则,整个字符串需要经历,向下向右,向上向右,这样的反复循环过程
down,loc
设定down变量表示是否向下,loc变量表示当前字符串数组的下标!
如果down为true,则loc+=1,字符串数组下标向后移动,将当前字符加入当前字符串中
如果down为false,则表示向右,则loc-=1,字符串数组下标向前移动,将当前字符加入当前字符串中
时间复杂度O(n)
三、画图解析
拆解:
3.1
3.2
3.3
3.4
3.5
3.6
3.7
3.8
3.9