【LeetCode】6.ZigZag Conversion Z字形变换

本文探讨了一种将字符串以S形排列的算法,并通过代码优化实现了显著的性能提升。从最初的148ms到优化后的76ms,展示了如何通过简化代码结构和逻辑判断来提高算法效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

示例1:

Input: s = "PAYPALISHIRING", numRows = 3
Output: "PAHNAPLSIIGYIR"
Explanation:
P   A   H   N
A P L S I I G
Y   I   R

示例2:

Input: s = "PAYPALISHIRING", numRows = 4
Output: "PINALSIGYAHRPI"
Explanation:

P     I    N
A   L S  I G
Y A   H R
P     I

 

解题思路:

本题题意理解起来非常困难。
反复阅读之后,意思是要S形排列。
那不是很简单么= =

if numRows == 1:
    return s
arr = []
for i in range(numRows):
    arr.append('')
lenth = len(s)
for i in range(lenth):
    loc = i % ((numRows - 1) * 2)
    if loc < numRows:
        arr[loc] = arr[loc] + s[i]
    else:
        arr[(numRows- 1) * 2 - loc] = arr[(numRows- 1) * 2 - loc] + s[i]
# print(arr)
res = ''
for i in range(numRows):
    res = res + arr[i]
return res

148 ms,打败了29.81%的对手。

解题思路1:

优化了下代码:

if numRows == 1:
    return s
arr = [''] * numRows
lenth = len(s)
period = (numRows - 1) * 2
for i in range(lenth):
    loc = i % period
    if loc < numRows:
        arr[loc] += s[i]
    else:
        arr[period - loc] += s[i]
# print(arr)
res = ''.join(arr)
return res

76 ms,打败了99.37%的对手。
嗯,像这样简单的题,微小的优化也是很重要的。

解题思路2:

读了下排名最前的代码:

if numRows == 1 or numRows >= len(s):
    return s
L = [''] * numRows
index, step = 0, 1
for x in s:
    L[index] += x
    if index == 0:
        step = 1
    elif index == numRows -1:
        step = -1
    index += step
return ''.join(L)

与我的主要差异在于,判断回文时,我使用了复杂的数学题,而靠前代码使用的是index的+1再-1。
值得学习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值