説明は、
Z型配置から左下に数指定された行に基づいて文字列を、説明します。
例えば、入力文字列は、行「LEETCODEISHIRING」の数は、次のように配置され、3です。
LCIR
ETOESIIG
EDHNは、
行右に読み取りラインに左からその後、あなたは、出力を必要とするなど、新しい文字列を生成:「LCIRETOESIIGEDHN」。
例
のアイデア
- 方法1(私は)n行に文字列は、各々が自分の文字列を取得し、次に(ステッチそれはコンピューティングのさまざまなを含むので、それが推奨されていません)
- 方法2
0からnumRowsの数であり、0からnumRowsの数まで、等、Z型:順に、屈折率変化の文字列配列(ARR [インデックス])の文字列にスプライス[numRowsの数空の文字列]トラバーサルS、まあ
答え
- パイソン
*方法1*
def convert(self, s: str, n: int) -> str:
if n==1: return s
ss = ''
for r in range(1,n+1):
if r==1 or r==n:
j=r-1
while j<len(s):
ss += s[j]
j+=(2*n-3+1) #n==1时不行
else:
j=r-1
count=1
while j<len(s):
ss += s[j]
if count%2==1:
j += 1+(n-1-r)*2+1
else:
j += 1+(r-2)*2+1
count+=1
return ss
*方法2*
def convert(self, s: str, numRows: int) -> str:
if numRows==1:return s
res=['']*numRows
index = 0
flag=1
for c in s:
res[index]+=c
if index==numRows-1: flag=-1
if index==0: flag=1
index+=flag
return ''.join(res)
- C ++
*方法1*
string convert(string s, int n) {
if (n==1) return s;
string ss("");
for (int r=1; r<=n; r++)
{
if (r==1 || r==n)
{
int j=r-1;
while (j<s.size())
{
ss += s[j];
j+=2*n-3+1;
}
}
else
{
int j=r-1,count=1;
while (j<s.size())
{
ss+=s[j];
if (count%2==1)
j+=1+(n-1-r)*2+1;
else
j+=1+(r-2)*2+1;
count++;
}
}
}
return ss;
}
*方法2*
string convert(string s, int numRows) {
if (numRows==1) return s;
vector<string> v(numRows, "");
int index=0,flag=1;
for (char c: s)
{
v[index].push_back(c);
if (index==numRows-1) flag=-1;
if (index==0) flag=1;
index+=flag;
/*
if (flag==1) index++;
if (flag==-1) index--;
*/
}
string res("");
for (auto t: v)
res+=t;
return res;
}