鍍金池/ 問答/數(shù)據(jù)庫  網(wǎng)絡(luò)安全  HTML/ 在面試中的一個(gè)邏輯題,求助下要如何解決?

在面試中的一個(gè)邏輯題,求助下要如何解決?

計(jì)算任選 3個(gè) (1 到 9 )的自然數(shù),他們能通過 加減乘數(shù) 運(yùn)算組合 形成 24 。例如 , 1,3,8 就能 通過 1X3X8 這樣的運(yùn)算 得到 24. 或者 7+8 +9 = 24
把所有 符合這個(gè)條件的數(shù)字 組合 列出來。 不考慮順序。 7,8,9 和 8,9,7 是一組數(shù)字。如果要用代碼要怎么寫?

回答
編輯回答
爛人

圖片描述

2017年11月9日 14:10
編輯回答
怪痞

最簡單的就是窮舉,先把1~9的數(shù)字的三位不重的排列窮舉出來,然后再給每種排列加上運(yùn)算符,窮舉出所有后綴表達(dá)式,再求值,最后去重。這是最簡單,也是效率最低的方法。

然后進(jìn)一步考慮題目的特點(diǎn),不妨規(guī)定找到的數(shù)字序列前兩位優(yōu)先運(yùn)算,然后再和最后一位運(yùn)算。容得三位數(shù)要運(yùn)算得到一個(gè)結(jié)果,要且僅要兩次運(yùn)算。考慮最后一次運(yùn)算,最后一次運(yùn)算必然是四則運(yùn)算中的其中一個(gè),于是目標(biāo)轉(zhuǎn)化為窮舉出經(jīng)過一次四則運(yùn)算可以得到24的長度為2的數(shù)字序列,且該序列的第二個(gè)數(shù)為1~9這9個(gè)整數(shù)中的其中一個(gè),第一個(gè)數(shù)為1~9這9個(gè)整數(shù)中除了該序列的第二個(gè)數(shù)外的兩個(gè)的運(yùn)算的結(jié)果。

比如最后一次運(yùn)算是加法,則這樣窮舉

? + 1 = 24 => 23
? + 2 = 24 => 22
? + 3 = 24 => 21
...
? + 9 = 24 => 15

最后一次運(yùn)算是減法,則這樣窮舉

? - 1 = 24 => 25
? - 2 = 24 => 26
? - 3 = 24 => 27
...
? - 9 = 24 => 33

最后一次運(yùn)算是乘法,則這樣窮舉

? * 1 = 24 => 24.0
? * 2 = 24 => 12.0
? * 3 = 24 => 8.0
...
? * 9 = 24 => 2.666666666666667

最后一次運(yùn)算是除法,則這樣窮舉

? / 1 = 24 => 24
? / 2 = 24 => 48
? / 3 = 24 => 72
...
? / 9 = 24 => 216

可以注意到,有一些結(jié)果是不可能的,例如216 / 9 = 24,就算允許重復(fù),9 * 9最多也不過81,從而兩位不同的1~9的整數(shù)的四則運(yùn)算無法達(dá)到216。

于是我們窮舉出了所有兩位1~9的整數(shù)的四則運(yùn)算可能得到的結(jié)果(有些是不可能的,可以剪枝),繼續(xù)窮舉,我們即可得到結(jié)果(會(huì)有重復(fù))

? + ? = 23 => 兩位不同的1~9的整數(shù)的加法運(yùn)算的結(jié)果最多為17,剪枝
...
? + ? = 17 => 兩位不同的1~9的整數(shù)的加法運(yùn)算的結(jié)果最多為17,可以繼續(xù)
? + 1 = 17 => 16 // 不符合題意,舍去
? + 2 = 17 => 15 // 不符合題意,舍去
...
? + 8 = 17 => 9 // 符合題意,得到序列9、8、7,運(yùn)算為(9+8)+7
? + 9 = 17 => 8 // 符合題意,但相同的序列和運(yùn)算已經(jīng)存在
...

最后還要去重,或者說判斷當(dāng)前窮舉出來的序列和運(yùn)算是否與前面已經(jīng)得到過的序列和運(yùn)算等價(jià),這個(gè)自己寫就好了。

24點(diǎn)牌算法是比較經(jīng)典的數(shù)據(jù)結(jié)構(gòu)與算法課程的例題,搜索一下會(huì)有更多結(jié)果,以上只是我臨時(shí)的思路,以我的水平,這一定不是最優(yōu)的解法(沒錯(cuò),我之前沒做過這題233)

技不如人,甘拜下風(fēng)
2018年8月22日 00:03