[hackerrank][python]Bigger is Greater

starzodiac
2 min readFeb 25, 2021

--

連結: https://www.hackerrank.com/challenges/bigger-is-greater/problem

這題目的要找出調整順序後比原輸入字串還大差距最小的字串

想法就是從尾開始找比前面大的字

如果要寫得很簡潔,可以把找到的位置之後做升冪排序就好

看討論,覺得這個解法超奧妙:

  1. slice 對於 -1 的操作其實並沒那麼直覺(可能我自己覺得不直覺),但是直接透過 w[:k:-1] 把字串反轉,後面就直接正向使用,超方便
  2. 倒向使用還有一個超級省事的地方,正序在判斷 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'

--

--

No responses yet