将字符串 "PAYPALISHIRING"
以Z字形排列成给定的行数:
python暴力解法:
class Solution(object):
def convert(self, s, numRows):
"""
:type s: str
:type numRows: int
:rtype: str
"""
n = len(s)
if n <= numRows or numRows==1:
return s
times = n/(numRows-1)
flag = n%(numRows-1)
result = ""
if times%2 == 0:
s += "0" * (2*numRows-2-flag)
iters = times/2
for i in range(numRows):
if i == 0:
for j in range(iters+1):
if s[i + j * 2 * (numRows - 1)] != "0":
result += s[i + j * 2 * (numRows - 1)]
elif i < (numRows - 1):
left = i
right = i + 2 * (numRows - 1 - i)
for j in range(iters+1):
if s[left + j * 2 * (numRows - 1)] != "0":
result += s[left + j * 2 * (numRows - 1)]
if s[right + j * 2 * (numRows - 1)] != "0":
result += s[right + j * 2 * (numRows - 1)]
elif i == (numRows - 1):
for j in range(iters):
result += s[i + j * 2 * (numRows - 1)]
if times%2 != 0:
s += "0" * (numRows-1-flag)
iters = times -1
iters = iters / 2
for i in range(numRows):
if i == 0:
for j in range(iters+1):
if s[i + j * 2 * (numRows - 1)] != "0":
result += s[i + j * 2 * (numRows - 1)]
elif i < (numRows - 1):
left = i
right = i + 2 * (numRows - 1 - i)
for j in range(iters+1):
if s[left + j * 2 * (numRows - 1)] != "0":
result += s[left + j * 2 * (numRows - 1)]
if s[right + j * 2 * (numRows - 1)] != "0":
result += s[right + j * 2 * (numRows - 1)]
elif i == (numRows - 1):
for j in range(iters+1):
if s[i + j * 2 * (numRows - 1)] != "0":
result += s[i + j * 2 * (numRows - 1)]
return result
python优化解法,利用一个指针让其来回遍历:
class Solution(object):
def convert(self, s, numRows):
"""
:type s: str
:type numRows: int
:rtype: str
"""
if numRows == 1 or numRows >= len(s):
return s
res = ['']*numRows
step = 1
index = 0
for i in s:
res[index] += i
if index == 0:
step =1
if index == numRows - 1:
step = -1
index += step
return ''.join(res)
C++:
class Solution {
public:
string convert(string s, int numRows) {
int n = s.length();
if(numRows==1 || numRows>=n){
return s;
}
vector<string> res(numRows);
int index = 0;
int step = 1;
for(int i = 0;i<n;i++){
res[index]+=s[i];
if(index == 0){
step = 1;
}
if(index == numRows-1){
step = -1;
}
index += step;
}
string result;
for(int i = 0;i<numRows;i++){
result+=res[i];
}
return result;
}
};