Z字型变换
将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下:
L C I R
E T O E S I I G
E D H N
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"LCIRETOESIIGEDHN"。
请你实现这个将字符串进行指定行数变换的函数:
string convert(string s, int numRows);
示例 1:
输入: s = "LEETCODEISHIRING", numRows = 3
输出: "LCIRETOESIIGEDHN"
解释:
L D R
E O E I I
E C I H N
T S G
感觉就是简单的模拟,熟悉API,不过千万记住要特判 枯了,还有对flag的简单使用啊蒟蒻在瑟瑟发抖
public class Main {
/*
思路:
用一个StringBUffer的数组,按照行来收取数据----->典型的模拟
首先一开始要考虑的问题是
1、变换的时候会转向
2、字符串需要一个一个添加到一个固定的位置上去(还是java大法好啊)
解决的方法:
1、利用标志位进行判断,强行改变方向
2、 利用StringBuffer类型的数组(当然List<Stringbuffer>也是可以的啦)
---->可以对每一行中的每一个字符串添加
最最最最最重要的就是要特判啊
*/
public String convert(String s, int numRows) {
if(numRows==1) return s; //特判
StringBuffer[] buffers = new StringBuffer[numRows];
for(int i =0;i<numRows;i++){
buffers[i] = new StringBuffer(); //对没一个数组中的StringBuffer初始化
}
int k =0;
boolean flag = true;
for(int i =0;i<s.length();i++){
buffers[k].append(s.charAt(i)); //添加第K行的某一个字符串
if(flag){
k++; //根据flag判断向上还是向下1行
}else {
k--;
}
if(k==numRows-1){ //加到了数组的边缘(0或者numRows)方向变换
flag = false;
}
if(k == 0){
flag = true;
}
}
StringBuffer stringBuffer =new StringBuffer();
for(int i =0;i<numRows;i++){ //重新拼接
stringBuffer.append(buffers[i]);
}
return stringBuffer.toString();
}
public static void main(String[] args){
Main m = new Main();
String s = "LEETCODEISHIRING";
String s1 ="ab";
System.out.println(m.convert(s,1));
}
}
浙公网安备 33010602011771号