1. 程式人生 > >【LeetCode】6.ZigZag Conversion Z字形變換

【LeetCode】6.ZigZag Conversion Z字形變換

示例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。
值得學習。