1、题目如下:
2、个人Python代码实现:
看到此题的第一反应就是,生成一个类似二维数组的多个字符串,然后用个标志位控制N字符中字符的方向,例如flag = True,在每次循环时候以flag = flag * -1来控制。
由于示例中字符串s可能看的不是很确切,所以为了更好的理解,于是自定义了一个字符串
s = "ADINSXTOJEBFKPUYVQLGCHMRWZ",numRows = 6。这样其进行N字型变换后,会按照英文字母排序,接下来用Excel加深理解:
以上图为例,原本的思路是根据numRows生成对应个数的字符串,“ABC”、“DEFGH”以此类推,最后将字符串求和,中间有个点是需要通过标志位控制字符方向。由于个人确实不擅长生成二维数组类似的操作,所以换个思路,采用循环的方式,也就是最初思路中生成的字符串个数,转换成循环次数即可。关于上图,做以下解释:
a、表的行数代表了循环次数,循环次数的值也就是numRows,那么这里就会出现一个问题,每一次循环在字符串s中取多少个字符呢?取得字符个数可以理解为表里面有多少种颜色。
换种说法就是,外部循环次数为numRows,内部循环通过字符下标去判断循环次数,这里经过过观察,每一次内部循环次数其实是math.ceil(len(s) / 2* (nowRows - 1)),如果这里次数不理解,可以参照上表字符A到字符E是第一次循环,字符B到字符G代表第二次循环(如果有小伙伴表示这个循环的方式和表中的背景颜色不同,也可以理解成T-Y是第一次,V-Z是第二次)
b、第一列加粗的不算是一次内部循环,这里可以理解成每一次内部循环开始前,需要去定位从哪个字符开始取,所以第一列就是用于定位的
c、针对有背景色的数字做个解释,其中的数字代表的是他与他左侧的字符的距离。以第2行为例,字符是DEFGH,D是第2次内部循环开始前,从D开始取,而DE、EF、FG、GH之间的下标差分别是8282,所以在最后的表里面第2行的值 分别就是18282。
d、继续观察,N字型转换的竖列之间下标差都是2 * (numRows - 1),参考下面两个图
针对以上几个点,可以开始写代码了:
代码如下:
class Solution:
def convert(self, s: str, numRows: int) -> str:
if numRows >= len(s) or numRows == 1: #当numRows值大于等于字符串s长度时,直接返回字符串s
out_put = s
else:
num1 = 0 #num1用于记录外部循环次数
num2 = math.ceil(len(s) / (2 * (numRows - 1))) #num2用于判断内部循环次数,这里注意向上取整
num = 2 *(numRows - 1) #num用于记录N字型竖列之间的下标差
out_put = '' #用于输出
while num1 < numRows:
temp = s[num1] #初始化每一次循环开始,从哪个下标开始取字符
out_put += temp #将初始化的字符加入out_put
i = 1
if num1 == 0 or num1 == (numRows - 1): #当循环不是第一次或者最后一次时,每一次内部循环只取1个字符加入out_put
while i <= num2:
num4 = num1 + num * i
try:
out_put += s[num4]
except:
pass
i += 1
num1 += 1
else:
while i <= num2:
num4 = num1 + num * i
num3 = num4 - 2 * num1
try:
out_put += s[num3]
out_put += s[num4]
except:
pass
i += 1
num1 += 1
return out_put
3、题解Python实现:
这里只截个图,思路实际上是我最初的思路,但是我知道杂生成多个字符串,也写不到这么简洁,膜拜。