[hackerrank][python]Bigger is Greater
2 min readFeb 25, 2021
連結: https://www.hackerrank.com/challenges/bigger-is-greater/problem
這題目的要找出調整順序後比原輸入字串還大且差距最小的字串
想法就是從尾開始找比前面大的字
如果要寫得很簡潔,可以把找到的位置之後做升冪排序就好
看討論,覺得這個解法超奧妙:
- slice 對於 -1 的操作其實並沒那麼直覺(可能我自己覺得不直覺),但是直接透過
w[:k:-1]
把字串反轉,後面就直接正向使用,超方便 - 倒向使用還有一個超級省事的地方,正序在判斷
v[:j+1:-1]
如果j = -1
會變成 0,好像沒有辦法直接判斷是不是到尾了(至少我是寫成list(v[:j:-1] if j+1 != 0 else “”
,超長)
倒序處理(超順):
def biggerIsGreater2(w):
w = list(w)
n = len(w)+1
ans = []
for k in range(-2, -n, -1):
if w[k] < w[k+1]:
ans = w[:k]
v = w[:k:-1]
for j in range(-k-1):
if w[k] < v[j]:
ans += list(v[j]) + v[:j] + list(w[k]) + v[j+1:]
break
else:
ans += v + w[k]
break return ''.join(ans) if ans else 'no answer'
正序處理(沒這麼順):
def biggerIsGreater3(w):
w = list(w)
n = len(w)+1
ans = []
for k in range(-2, -n, -1):
if w[k] < w[k+1]:
ans = w[:k]
v = w[k+1:]
for j in range(-1, -len(v)-1, -1):
if w[k] < v[j]:
ans += list(v[j]) + list(v[:j:-1] if j+1 != 0 else "") + list(w[k]) + v[j-1:-len(v)-1:-1]
break
else:
ans += v[::-1] + w[k]
break return ''.join(ans) if ans else 'no answer'