Codewars編碼套路練習(xí):給定一個正整數(shù)朴皆,找到由相同數(shù)字組成的下一個更大的整數(shù)

問題描述

在Codewars對套路練習(xí)的分類中弓坞,這是一個難度為4的題目隧甚。難度數(shù)字越低,代表越困難渡冻。完成之后得到的積分戚扳,就越高。

你得編寫一個函數(shù)族吻,接受一個正整數(shù)作為輸入帽借,然后輸出由相同數(shù)字組成的下一個更大的數(shù):

next_bigger(12)==21
next_bigger(513)==531
next_bigger(2017)==2071

如果找不到由相同數(shù)字組成的更大整數(shù),則返回-1:

next_bigger(9)==-1
next_bigger(111)==-1
next_bigger(531)==-1

測試用例

Test.assert_equals(next_bigger(12),21)
Test.assert_equals(next_bigger(513),531)
Test.assert_equals(next_bigger(2017),2071)
Test.assert_equals(next_bigger(414),441)
Test.assert_equals(next_bigger(144),414)

問題標簽

算法 數(shù)字 字符串 整型數(shù)

問題鏈接

http://www.codewars.com/kata/55983863da40caa2c900004e/train/python

問題解答

解題思路

一開始超歌,我曾經(jīng)想的很簡單砍艾,計劃把全部數(shù)字的排列組合都算出來并按順序排列在列表中,然后找到給定數(shù)字在列表中的索引值巍举。如果索引值為列表的最后一位脆荷,則返回-1;如果不是懊悯,則返回更大一個索引位置的值蜓谋。

看上去思路很簡單,但是實現(xiàn)起來的效率很差炭分。首先桃焕,隨著數(shù)字變大,進行初步排列的時間會很長捧毛,因為會有很多種排列方法观堂;其次,在排列過程中呀忧,可能需要較大的內(nèi)存空間來保存過程中生成的列表师痕。最后的兩步操作的效率倒是還好。

綜合上面的考慮而账,沒有繼續(xù)按照這種思路實現(xiàn)胰坟。

最后,經(jīng)過嘗試和思考福扬,我找到了如下的思路:

首先腕铸,找到給定數(shù)字中,從右至左沒有按從大到小順序排列的一段數(shù)字铛碑。假如給定數(shù)字式987685432狠裹,那么沒有按順序排列的一段數(shù)字就是,685432汽烦。

然后涛菠,對找到的這段數(shù)字重新排列。先把給定數(shù)字變成兩個列表,[9,8,7]與[6,8,5,4,3,2]俗冻,然后對后面列表中的這些數(shù)字礁叔,取比6大一位的數(shù)字,即8迄薄。最后琅关,把除8以外的數(shù)字,按從小到大得順序重新排列讥蔽。

最后涣易,再把重排后的列表,與沒有變動的列表相加冶伞,組成最后的數(shù)字新症。

編程派的解法

具體實現(xiàn)如下:

:::python
def next_bigger(n):
    to_list = list(int(i) for i in str(n))
    length = len(to_list)
    if length == 1:
        return -1

    i = -1
    while to_list[i] <= to_list[i - 1]:
        i -= 1
        if i == -length:
            return -1

    process_list = to_list[i - 1:]
    replace = 0

    for num in sorted(process_list):
        if num > process_list[0]:
            replace = num
            break

    process_list.remove(replace)

    result = to_list[:i - 1] + [replace] + sorted(process_list)

    return int(''.join(str(i) for i in result))

網(wǎng)友解法摘錄

目前在Codewars.com,完成這道題目的網(wǎng)友只有389人响禽。

網(wǎng)友pavel.koshev:得到三個最佳實踐投票

:::python
def next_bigger(n):
  n = str(n)[::-1]
  try:
    i = min(i+1 for i in range(len(n[:-1])) if n[i] > n[i+1])
    j = n[:i].index(min([a for a in n[:i] if a > n[i]]))
    return int(n[i+1::][::-1]+n[j]+''.join(sorted(n[j+1:i+1]+n[:j]))) 
  except:
    return -1

網(wǎng)友adam-tokarski

:::python    
def next_bigger(n):
    i, ss = n, sorted(str(n))

    if str(n) == ''.join(sorted(str(n))[::-1]):
        return -1;

    while True:
        i += 1;
        if sorted(str(i)) == ss and i != n:
            return i;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末徒爹,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子芋类,更是在濱河造成了極大的恐慌隆嗅,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件梗肝,死亡現(xiàn)場離奇詭異榛瓮,居然都是意外死亡铺董,警方通過查閱死者的電腦和手機巫击,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來精续,“玉大人坝锰,你說我怎么就攤上這事≈馗叮” “怎么了顷级?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長确垫。 經(jīng)常有香客問我弓颈,道長,這世上最難降的妖魔是什么删掀? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任翔冀,我火速辦了婚禮,結(jié)果婚禮上披泪,老公的妹妹穿的比我還像新娘纤子。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布控硼。 她就那樣靜靜地躺著泽论,像睡著了一般。 火紅的嫁衣襯著肌膚如雪卡乾。 梳的紋絲不亂的頭發(fā)上翼悴,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天,我揣著相機與錄音幔妨,去河邊找鬼抄瓦。 笑死,一個胖子當著我的面吹牛陶冷,可吹牛的內(nèi)容都是我干的钙姊。 我是一名探鬼主播,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼埂伦,長吁一口氣:“原來是場噩夢啊……” “哼煞额!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起沾谜,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤膊毁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后基跑,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體婚温,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年媳否,在試婚紗的時候發(fā)現(xiàn)自己被綠了栅螟。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡篱竭,死狀恐怖力图,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情掺逼,我是刑警寧澤吃媒,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站吕喘,受9級特大地震影響赘那,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜氯质,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一募舟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧病梢,春花似錦胃珍、人聲如沸梁肿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吩蔑。三九已至,卻和暖如春填抬,著一層夾襖步出監(jiān)牢的瞬間烛芬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工飒责, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留赘娄,地道東北人。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓宏蛉,卻偏偏與公主長得像遣臼,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子拾并,可洞房花燭夜當晚...
    茶點故事閱讀 43,509評論 2 348

推薦閱讀更多精彩內(nèi)容