原题如下:
分析
这个题实际上就是把单词里面的字符一个个地拿出来,从第一行摆到第numRows行,之后又一个一个往前一行摆,直到摆到第一行,再次向后面的行一行一行摆,直到单词里面的字符被依次用完为止
方法一
按照分析里面的规律,题目里面如规定只摆一行,那么字符顺序没有变化,这一点很好理解;如果行数大于1了,基本的方法,就是建立一系列共numRows个动态数组用于盛放每一行里面的应有的字符。首先从给定的字符串里面依次拿出字符,从系列的动态数组里面的第一个开始放,放完一个了,再取到第二个字符的时候,放到下一个动态数组里……倘若某个字符放到了编号最大的动态数组,那么下一个字符就要返回往编号小的动态数组里面放,直到放到第一个,再返回放置,一直到取完字符串里面的字符为止
本方法的代码:
/*
*作者@v7fgg
*执行用时 :23 ms, 在所有 Java 提交中击败了18.11%的用户
*内存消耗 :40.3 MB, 在所有 Java 提交中击败了8.33%的用户
*2020年6月1日 11:37
*/
class Solution {
public String convert(String s, int numRows) {
if(numRows==1||s.length()==0){
//这时不用进行z变换,格式化输出就行
return s;
}
List<List<Character>> list=new ArrayList<>();
String ans="";
for(int j=0;j<numRows;j++){
List<Character> lis=new ArrayList<>();
list.add(lis);
}
int pow=-1;//用于变换到下一个字符插入的list号
int listNo=0;//list号的变量
for(int i=0;i<s.length();i++){
list.get(listNo).add(s.charAt(i));
if(listNo==0||listNo==numRows-1){
pow=-pow;
//从0~numRows-1~0循环插入字符,对应的过程是list号加1或者减1,遇到0,下一个插入字符的list号加1,遇到numRows-1,下一个字符插入的list号减1
}
listNo+=pow;
}
for(List<Character> l:list){
for(char c:l){
ans+=c;
}
}
return ans;
}
}