將乙個給定字串根據給定的行數,以從上往下、從左到右進行 z 字形排列。
比如輸入字串為"leetcodeishiring"
行數為 3 時,排列如下:
l c i r
e t o e s i i g
e d h n
之後,你的輸出需要從左往右逐行讀取,產生出乙個新的字串,比如:"lciretoesiigedhn"
。
請你實現這個將字串進行指定行數變換的函式:
string convert(string s, int numrows);
示例 1:
輸入: s = "leetcodeishiring", numrows = 3
輸出: "lciretoesiigedhn"
示例 2:
輸入: s = "leetcodeishiring", numrows = 4
輸出: "ldreoeiiecihntsg"
解釋:l d r
e o e i i
e c i h n
t s g
第一種思路:
直白的麻瓜思路,開個陣列按順序乙個個壓進去,得到上面解釋裡的陣列,然後再從左到右,從上到下讀出來就好。
壓進去的過程有兩種可能,
1. 從上往下壓, 定義state = "down", 每次x += 1,當x觸底就轉換state為"up"
2. 從左下往右上壓, 定義state = "up", 每次 x -= 1, y += 1, 當x歸零就轉換state為"down"
class solution(object):
def convert(self, s, n):
""":type s: str
:type numrows: int
:rtype: str
"""#麻瓜解法:開個陣列,把輸入按要求放進去,然後再按輸出順序讀出來
if n <= 1:
return s
l = len(s)
record = [[0] * l for _ in range(n)]
x, y = 0, 0
state = "down"
for i, char in enumerate(s):
# print x, y, char
record[x][y] = char
if state == "down":
if x != n - 1:
x += 1
else:
state = "up"
x -= 1
y += 1
continue
elif state == "up":
if x != 0:
x -= 1
y += 1
else:
state = "down"
x += 1
# print record
res = ""
for row in record:
for char in row:
if char != 0:
res += char
return res
第二種思路:
找規律。
"""#找規律
if n <= 1:
return s
l = len(s)
res = ""
for i in range(n):
tmp, index = "", i
if i in [0, n - 1]:
while(index < l):
tmp += s[index]
index += 2 * (n - 1)
else:
state = "down"
while(index < l):
tmp += s[index]
if state == "down":
state = "up"
index += 2 * (n - 1 - i)
else:
state = "down"
index += 2 * i
res += tmp
return res
上面是2019.5.10寫的,下面是2019.6.1寫的,更醜了……
class solution(object):
def convert(self, s, numrows):
""":type s: str
:type numrows: int
:rtype: str
"""#第一行和最後一行都是相差 2 * (n - 1)
#對於直角在上面的直角三角形, 相差 2 * (n - 1 - i)
#對於直角在下面的直角三角形, 相差 2 * i
if not s:
return s
res = ""
for idx in range(numrows):
res += s[idx]
if idx in [0, numrows - 1]:
tmp = idx + 2 *(numrows - 1)
while tmp < len(s):
res += s[tmp]
tmp += 2 *(numrows - 1)
else:
tmp = idx + 2 * (numrows - 1 - idx)
tri = "down"
while tmp < len(s):
res += s[tmp]
if tri == "up":
tmp += 2 * (numrows - 1 - idx)
tri = "down"
else:
tmp += 2 * idx
tri = "up"
return res
LeetCode python 6 Z 字形變換
將乙個給定字串根據給定的行數,以從上往下 從左到右進行 z 字形排列。比如輸入字串為 leetcodeishiring 行數為 3 時,排列如下 l c i r e t o e s i i g e d h n之後,你的輸出需要從左往右逐行讀取,產生出乙個新的字串,比如 lciretoesiigedh...
LeetCode Python 打家劫舍I
你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。示例 1 輸入 1...
leetcode Python編碼練習
貪心演算法 1.環形路上有n個加油站,第i個加油站的汽油量是gas i 你有一輛車,車的油箱可以無限裝汽油。從加油站i走到下乙個加油站 i 1 花費的油量是cost i 你從乙個加油站出發,剛開始 的時候油箱裡面沒有汽油。求從哪個加油站出發可以在環形路上走一圈。返回加油站的下標,如果沒有答案的話返回...