def convert(s, num_rows): """ :type s: str :type numRows: int :rtype: str LEETCODEISHIRING numrows=3 columnsdiff_length=2*3-2=4 L C I R E T O E S I I G E D H N LCIRETOESIIGEDHN LEETCODEISHIRING numrows=4 columnsdiff_length=2*4-2=6 L D R E O E I I E C I H N T S G LDREOEIIECIHNTSG """ s_length = len(s) # 得出要处理的字符的长度 columnsdiff_length = 2 * num_rows - 2 # 两列之间的差 result = "" # 定义排列之后的结果字符 if num_rows <= 0: print("请输入正确的行数,行数必须大于0") if s_length == 0 or num_rows == 1: print(s) return s # 如果要处理的字符长度是0即为空,或输入的行数等于1时即不需要处理,则返回原字符串 for i in range(num_rows): # 从第一行遍历到最后一行 for j in range(i, s_length, columnsdiff_length): result += s[j] # 第一行和最后一行 还有普通行的整列数字 if i != 0 and i != num_rows - 1 and j - 2 * i + columnsdiff_length < s_length: result += s[j - 2 * i + columnsdiff_length] # 单列行的数字 print(result) return result ss = "LEETCODEISHIRING" convert(ss, 3) convert(ss, 4) # convert(ss, 0) # convert(ss, 1) # convert(ss, -1) def convert1(s, num_rows): """ :type s: str :type numRows: int :rtype: str """ str_length = len(s) result = "" if num_rows <= 1: print(s) return s for i in range(num_rows): c1 = 2 * num_rows - 2 * (i + 1) c2 = 2 * i cnt = i result += s[cnt] while cnt < str_length: if c1 != 0: cnt += c1 if cnt < str_length: result += s[cnt] if c2 != 0: cnt += c2 if cnt < str_length: result += s[cnt] print(result) return result s2 = "LEETCODEISHIRING" convert1(s2, 3) convert1(s2, 4)