給定數(shù)字n,數(shù)組arr={1,3,5,2}闲昭,求arr中的數(shù)字能組成小于n的最大整數(shù)

字節(jié)-算法面試題:給定數(shù)字n和集合arr,求arr中的數(shù)字能組成小于n的最大整數(shù)靡挥,arr中的數(shù)字可以重復(fù)使用序矩。
例:n=5213,arr={0,3,5,2}跋破,返回結(jié)果應(yīng)該為5205簸淀。

解題思路

按位先正向后反向查找,使用遞歸實現(xiàn)功能毒返。
需要特別注意的是:首位和末位租幕,正向遞歸時判斷是否是末位,回溯時判斷是否是首位拧簸。

正向查找

根據(jù)n的位數(shù)劲绪,從大數(shù)位到小數(shù)位進(jìn)行遞歸:如果當(dāng)前數(shù)字可用,就將當(dāng)前數(shù)字放入該位置盆赤。
特殊情況:如果是最后一位贾富,需要將 比當(dāng)前數(shù)字更小的最大數(shù)字 放到該位置上。

無匹配

如果當(dāng)前數(shù)字無匹配牺六,將 比當(dāng)前數(shù)字更小的最大數(shù)字 放到該位置上颤枪,同時后續(xù)數(shù)位都填充最大數(shù)字。

回溯-反向查找

如果沒有 比當(dāng)前數(shù)字更小的最大數(shù)字淑际,則回溯到上一位置畏纲,將 比當(dāng)前數(shù)字更小的最大數(shù)字 放到該位置上,同時后續(xù)數(shù)位都填充最大數(shù)字春缕。
特殊情況:如果回溯到首位仍然沒有 比當(dāng)前數(shù)字更小的最大數(shù)字盗胀,則取消最大位,同時后續(xù)數(shù)位都填充最大數(shù)字淡溯。

編程思路

  1. 回溯時读整,一定會查找 比當(dāng)前數(shù)字更小的最大數(shù)字 是否存在,與“無匹配”的功能重復(fù)咱娶,所以可以寫到同1個函數(shù)中米间;
  2. 正向查找和回溯時,傳遞參數(shù)為當(dāng)前的位置膘侮,所以可以將當(dāng)前位置position作為傳參屈糊;
  3. 最后判斷position的位置,并將之后的位置全部填充為可用的最大值琼了。

Python代碼

n = 5213
arr = {0,3,5,2}

arr_list_sort = sorted(list(arr))       # 排序可用數(shù)字逻锐,以便于查找 比當(dāng)前數(shù)字更小的最大數(shù)字
n = str(n)
n_len = len(n) 
res = [arr_list_sort[0]] * n_len        # 使用最小值初始化所有位置

def fan(position):
    """回溯-反向遞歸夫晌,并判斷是否存在比當(dāng)前數(shù)字更小的數(shù)字
    position[int]: 當(dāng)前位置
    """
    # print("position = ", position)
    np = int(n[position])
    if position == 0:       # 回溯到首位
        for arrr in arr_list_sort[::-1]:
            if arrr<np:         # 存在比當(dāng)前數(shù)字更小的數(shù)字
                res[position] = arrr
                return position
        position = -1
        res.pop(0)
        return position
    else:
        for arrr in arr_list_sort[::-1]:
            if arrr<np:         # 存在比當(dāng)前數(shù)字更小的數(shù)字
                res[position] = arrr
                return position
        return fan(position-1)

def zheng(position):
    """正向遞歸
    position[int]: 當(dāng)前位置
    """
    np = int(n[position])
    if position < n_len-1:
        if np not in arr:
            position = fan(position)
            return position
        else:            
            res[position] = np
            return zheng(position+1)
    else:   # 最后一位
        position = fan(position)
        return position

position = zheng(position=0)
lenres = len(res)

if lenres == 0:                     # n為1位數(shù)字 且 arr中沒有比n更小的數(shù)字
    res = "無結(jié)果!"
else:
    if position != n_len-1:         # 沒有處理到最后一位
        position += 1
        for _ in res[position:]:    # 后續(xù)位置填充可用的最大值
            res[position] = arr_list_sort[-1]
    res = sum([pow(10,i)*j for i,j in enumerate(res[::-1])]) 

print(res)

個人原創(chuàng)昧诱,歡迎交流討論晓淀!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市盏档,隨后出現(xiàn)的幾起案子凶掰,更是在濱河造成了極大的恐慌,老刑警劉巖蜈亩,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件懦窘,死亡現(xiàn)場離奇詭異,居然都是意外死亡稚配,警方通過查閱死者的電腦和手機(jī)畅涂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來道川,“玉大人午衰,你說我怎么就攤上這事》叨瑁” “怎么了苇经?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長宦言。 經(jīng)常有香客問我扇单,道長,這世上最難降的妖魔是什么奠旺? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任蜘澜,我火速辦了婚禮,結(jié)果婚禮上响疚,老公的妹妹穿的比我還像新娘鄙信。我一直安慰自己,他們只是感情好忿晕,可當(dāng)我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布装诡。 她就那樣靜靜地躺著,像睡著了一般践盼。 火紅的嫁衣襯著肌膚如雪鸦采。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天咕幻,我揣著相機(jī)與錄音渔伯,去河邊找鬼。 笑死肄程,一個胖子當(dāng)著我的面吹牛锣吼,可吹牛的內(nèi)容都是我干的选浑。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼玄叠,長吁一口氣:“原來是場噩夢啊……” “哼古徒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起读恃,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤描函,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后狐粱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡胆数,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年肌蜻,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片必尼。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡蒋搜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出判莉,到底是詐尸還是另有隱情豆挽,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布券盅,位于F島的核電站帮哈,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏锰镀。R本人自食惡果不足惜娘侍,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望泳炉。 院中可真熱鬧憾筏,春花似錦、人聲如沸花鹅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽刨肃。三九已至古拴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間之景,已是汗流浹背斤富。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留锻狗,地道東北人满力。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓焕参,卻偏偏與公主長得像,于是被迫代替她去往敵國和親油额。 傳聞我的和親對象是個殘疾皇子叠纷,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,452評論 2 348

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