题目:
将字符串 "PAYPALISHIRING"
以Z字形排列成给定的行数:(下面这样的形状)
P A H N //0号数组 A P L S I I G //1号数组 Y I R //2号数组
之后按逐行顺序依次排列:"PAHNAPLSIIGYIR"
实现一个将字符串进行指定行数的转换的函数:
string convert(string text, int nRows);
convert("PAYPALISHIRING", 3)
应当返回 "PAHNAPLSIIGYIR"
。
我的分析:
可以看出,在排列好的图形中,照着z字形读取的话就是字符串的原顺序,于是我们逆向思维考虑,多少行我就用多少个的数组保存,假设有4行,那么原字符串照顺序添加到数组就是
0123210123210123…….
(这里的数字表示的是保存的数组的编号)
之后我们只要照数组的顺序(0 1 2 3)读取里面的字符即可
代码:
public String convert(String s, int numRows) {
if(numRows==1)
return s;
List<Character>[] list=new List[numRows]; //多少行就创建多少个数组
for(int i=0;i<numRows;i++){
list[i]=new ArrayList<>();
}
int temp=0;
int temp2=0;
int flag=0;
while(temp<s.length()){
while(temp<s.length()&&flag!=numRows){
list[flag++].add(s.charAt(temp++));
}
flag=numRows-2;
while(temp<s.length()&&flag!=-1){
list[flag--].add(s.charAt(temp++));
}
flag=1;
}
char[] result=new char[s.length()];
while(temp2<s.length()){ //按照数组的顺序读取字符,加入到字符数组
for(int k=0;k<numRows;k++){
Iterator iterator=list[k].iterator();
while(iterator.hasNext()){
result[temp2++]=(char)iterator.next();
}
}
}
String resultstring=new String(result); //把字符数组变成字符串
return resultstring;
}
可以参考一下别人的,好像比我的简洁很多。。。