一,问题描述
ZigZag问题可以举个例子:
当输入原字符串和行数后,求ZigZag后的字符串。
二,通过上述观察,我们总结一下
1,当rows=3时,0,1,2,3组成的长度是2*rows-2(即长度为4)。
当rows=4时,0,1,2,3,4,5组成的长度为2*rows-2(即长度为6)。
因此,每一轮的长度为size=2*numRows-2。
2,除了第一行和最后一行,中间的行的相邻字幕,设置a在b之前,则a与b的长度为: j+(2*nRows-2)-2*i ; (nRows表示给定的行数,j表示第j列,i表示第i行。
三,代码,AC了的,用Java实现的
import java.util.*;
public class Test2{
public static String convert(String s,int numRows)
{
if(s.length()==0||numRows<=1)//判断给定的行数是否小于等于1,或者字符串长度为0,是的话,直接输出字符串
{
return s;
}
StringBuffer sb1=new StringBuffer();//使用StringBuffer方法可以把每个字符加上,更加方便
int size=2*numRows-2;//每一轮的长度为size,size=2*numRows-2,可以看我上面给出的解释
for(int i=0;i<numRows;i++)
{
for(int j=i;j<s.length();j+=size)
{
sb1.append(s.charAt(j));
if(i!=0&&i!=numRows-1)//除去第0行和第numRows-1行外,中间的 (行数从第0开始)
{
if((j+size-2*i)<s.length())//除了第一列外,每一行中其他列进行判断。
{
sb1.append(s.charAt(j+size-2*i));
}
}
}
}
return sb1.toString();//使用了StringBuffer后,则使用了toString.
}
public static void main(String [] args)
{
Scanner scan=new Scanner(System.in);
String str;
String data;
int lenth;
str=scan.next();
lenth=scan.nextInt();
data=convert(str,lenth);
System.out.println("结果="+data);
}
}