给定一个字符串,要求字符穿以“Z”形式输出,并返回最终字符串
思路如下:
- 先确定需要多少列,得到Z字矩阵的大小
在知道n行的前提下,我们可以知道每两列一共是2n-2个字符。假设原字符串长度为s_len,那么s_len/(2n-2)*(n-1)则为至少需要的列数,然后需要判断剩下的字符还可以可以拼几列。
接下来,通过模运算来确定最后还需要几列(0, n-1)。 - 依次按照Z字的走势给矩阵赋值
按照走势赋值时,需要注意的是下标越界的问题,所以判断条件一个也不能少。 - 将矩阵按行从左到右依次赋值给新的string
代码如下:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
if __name__ == '__main__':
src_s = 'abcdefghijkllmnopq'
s_len = len(src_s)
r_num = 5
# Step1 计算至少需要多少组(一组为"一竖+一折")
c_num = s_len/(2*r_num-2) * (r_num-1)
print(c_num)
# 在Step1 的基础上,查看后边还需几列
remain_len = s_len - (2*r_num-2) * (c_num/(r_num-1))
if remain_len == 0:
c_num += 0
else:
c_num += remain_len%r_num + 1
print(c_num)
# new_s = [['0']*c_num]*r_num # 注意行和列
new_s = []
for i in range(0, r_num):
tmp = []
for j in range(0, c_num):
tmp.append('0')
new_s.append(tmp)
print(new_s)
# 赋值给新的
s_i = 0
cur_i = 0
cur_j = 0
while s_i<s_len:
while cur_i<r_num and cur_j<c_num and s_i<s_len:
print('cur_i={}, cur_j={}, s_i={}'.format(cur_i, cur_j, s_i))
new_s[cur_i][cur_j] = src_s[s_i]
cur_i += 1
s_i += 1
cur_i = cur_i - 2
cur_j = cur_j + 1
while s_i<s_len and cur_i>0 and cur_j<c_num:
print('cur_i={}, cur_j={}, s_i={}'.format(cur_i, cur_j, s_i))
new_s[cur_i][cur_j] = src_s[s_i]
print('src_s[s_i]={}'.format(src_s[s_i]))
cur_i -= 1
cur_j += 1
s_i += 1
cur_i = 0
print(new_s)
# 按行读取有效字符,并输出
s= ''
for i in range(0,r_num):
for j in range(0,c_num):
c = new_s[i][j]
if c != '0':
s += c
print s