タイトル
所与の行に従って指定した文字列の数は、ダウンに、Z型配置から左。
例えば、入力文字列は、行「LEETCODEISHIRING」の数は、次のように配置され、3です。
LCIR
ETOESIIG
EDHNは、
行右に読み取りラインに左からその後、あなたは、出力を必要とするなど、新しい文字列を生成:「LCIRETOESIIGEDHN」。
あなたは、この行の文字列変換関数指定された数を実現します:文字列変換(文字列s、int型numRowsの数を)。
例1:
入力:S = "LEETCODEISHIRING"、numRowsの数 = 3
出力: "LCIRETOESIIGEDHN"
実施例2:
入力:S = "LEETCODEISHIRING"、numRowsの数 = 4
出力: "LDREOEIIECIHNTSG"
英語のコミュニティが突然情報が中国社会に同期させることができた、それは英語、中国語が良くないかを確認することもあります
思考
この質問は、文字列が与えられ、出力は所定の形状に再配置されています。フォームが水平に配置されたZを考えると、また、とにかく、あなたはどのように考えるか確認するために、Vの特殊な形態としてすべてのことを見ることができます。
最初に私で、私は適切な法律を見つけることができれば、特別な機能を見つけ、あること、思っていた、両方に直接関連し、長い時間のために結果が見つからない見つけるために、私を許して大まかに見えた後に作られた、数学ではかす対応する機能があるようなコードの偉大な神は、私が感じるが、ルックアップするためにしたくない、何の研究で多くのことがありません。
私は突然、すべての後にパラメータが少しくらいかもしれ場合には、使用することは困難に再帰的な解決するために、再帰的なアルゴリズムを使用しますが、それでも冷却することができないと思う質問を行った後。
対応する位置に各文字塗りを最後に、座標の組が設けられており、次の位置の座標が順次決定され、次いでサイクルN回。
それはケースに2列に配置された唯一の行と、特別な注意処理ことに留意すべきです。
コード
public class T006 {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println( convert( "LEETCODEISHIRING", 3 ) );
}
public static String convert(String s, int numRows) {
//如果是只排列成一行的话,原样输出就可以了
if(numRows == 1 )
return s;
//用于存储每一行的字符串,并输出
StringBuilder[] rows = new StringBuilder[numRows];
for( int i = 0; i < numRows; i++ )
rows[i]= new StringBuilder();
int count = 0;
int i = 1;
int j = 1;
//循环那么多次,得到结果
while( count < s.length() ) {
//用来判断排列到那一列了,循环到竖着的一列判定为真
if( i%(numRows-1) == 1 || numRows == 2 ) {
rows[j-1].append(s.charAt( count++ ));
//rows[j-1] += s.charAt( count++ )+"";
//用于判断是不是到这一列的尽头了,是的话就跳的下一列,上一行;否则行加一
if( j+1<=numRows )
j++;
else{
i++;
j--;
}
}else {
rows[j-1].append(s.charAt( count++ ));
//rows[j-1] += s.charAt( count++ )+"";
i++;
j--;
}
}
String output = "";
for( int k = 0; k < numRows; k++ ) {
output += rows[k].toString();
//System.out.println( k+"row:\t" + rows[k] );
}
return output;
}
}