小浩算法|一文讓你學會如何用代碼判斷"24"點

“24點”是一種數學遊戲,正如象棋、圍棋一樣是一種人們喜聞樂見的娛樂活動。它始於何年何月已無從考究,但它以自己獨具的數學魅力和豐富的內涵正逐漸被越來越多的人們所接受。今天就為大家分享一道關於“24點”的算法題目。

話不多說,直接看題。

題目:你有 4 張寫有 1 到 9 數字的牌。你需要判斷是否能通過 *,/,+,-,(,) 的運算得到 24。

示例 1:

輸入: [4, 1, 8, 7]

輸出: True

解釋: (8-4) * (7-1) = 24

示例 2:

輸入: [1, 2, 1, 2]

輸出: False

注意:

除法運算符 / 表示實數除法,而不是整數除法。例如 :4 / (1 - 2/3) = 12 。

每個運算符對兩個數進行運算。特別是我們不能用 - 作為一元運算符。例如,[1, 1, 1, 1] 作為輸入時,表達式 -1 - 1 - 1 - 1 是不允許的。

你不能將數字連接在一起。例如,輸入為 [1, 2, 1, 2] 時,不能寫成 12 + 12 。


題目分析


拿到題目,第一反應就可以想到暴力求解。如果我們要判斷給出的4張牌是否可以通過組合得到24,那我們只需找出所有的可組合的方式進行遍歷。

4個數字,3個操作符,外加括號,基本目測就能想到組合數不會大到超出邊界。所以,我們只要把他們統統列出來,不就可以進行求解了嗎?說幹就幹!

我們首先定義個方法,用來判斷兩個數的的所有操作符組合是否可以得到24。

<code>1func judgePoint24_2(a, b float64) bool {
2    return a+b == 24 || a*b == 24 || a-b == 24 || b-a == 24 || a/b == 24 || b/a == 24 
3}/<code>


但是這個方法寫的正確嗎?其實不對!因為在計算機中,實數在計算和存儲過程中會有一些微小的誤差,對於一些與零作比較的語句來說,有時會因誤差而導致原本是等於零但結果卻小於或大於零之類的情況發生,

所以常用一個很小的數 1e-6 代替 0,進行判讀!

(1e-6:表示1乘以10的負6次方。Math.abs(x)<1e-6 其實相當於x==0。1e-6(也就是0.000001)叫做epslon,用來抵消浮點運算中因為誤差造成的相等無法判斷的情況。這個知識點需要掌握!)

舉個例子:

<code> 1func main() {
2    var a float64
3    var b float64
4    b = 2.0
5    //math.Sqrt:開平方根
6    c := math.Sqrt(2)
7    a = b - c*c
8    fmt.Println(a == 0)                  //false
9    fmt.Println(a  -(1e-6)) //true
10}/<code>

這裡直接用 a==0 就會得到false,但是通過 a < 1e-6 && a > -(1e-6) 卻可以進行準確的判斷。

所以我們將上面的方法改寫:

<code> 1//go語言
2//judgePoint24_2:判斷兩個數的所有操作符組合是否可以得到24
3func judgePoint24_2(a, b float64) bool {
4    return (a+b  24-1e-6) ||
5        (a*b  24-1e-6) ||
6        (a-b  24-1e-6) ||
7        (b-a  24-1e-6) ||
8        (a/b  24-1e-6) ||
9        (b/a  24-1e-6) 
10}/<code>


完善了通過兩個數來判斷是否可以得到24的方法,現在我們加一個判斷三個數是否可以得到24的方法。

<code> 1//硬核代碼,不服來辯!
2func judgePoint24_3(a, b, c float64) bool {
3    return judgePoint24_2(a+b, c) ||
4        judgePoint24_2(a-b, c) ||
5        judgePoint24_2(a*b, c) ||
6        judgePoint24_2(a/b, c) ||
7        judgePoint24_2(b-a, c) ||
8        judgePoint24_2(b/a, c) ||
9
10        judgePoint24_2(a+c, b) ||
11        judgePoint24_2(a-c, b) ||
12        judgePoint24_2(a*c, b) ||
13        judgePoint24_2(a/c, b) ||
14        judgePoint24_2(c-a, b) ||
15        judgePoint24_2(c/a, b) ||
16
17        judgePoint24_2(c+b, a) ||
18        judgePoint24_2(c-b, a) ||
19        judgePoint24_2(c*b, a) ||
20        judgePoint24_2(c/b, a) ||
21        judgePoint24_2(b-c, a) ||
22        judgePoint24_2(b/c, a)
23}/<code>


好了。三個數的也出來了,我們再加一個判斷4個數為24點的方法:(排列組合,我想大家都會....)

前方高能!!!

前方高能!!!

前方高能!!!


<code> 1//硬核代碼,不服來辯!
2func judgePoint24(nums []int) bool {
3    return judgePoint24_3(float64(nums[0])+float64(nums[1]), float64(nums[2]), float64(nums[3])) ||
4        judgePoint24_3(float64(nums[0])-float64(nums[1]), float64(nums[2]), float64(nums[3])) ||
5        judgePoint24_3(float64(nums[0])*float64(nums[1]), float64(nums[2]), float64(nums[3])) ||
6        judgePoint24_3(float64(nums[0])/float64(nums[1]), float64(nums[2]), float64(nums[3])) ||
7        judgePoint24_3(float64(nums[1])-float64(nums[0]), float64(nums[2]), float64(nums[3])) ||
8        judgePoint24_3(float64(nums[1])/float64(nums[0]), float64(nums[2]), float64(nums[3])) ||
9
10        judgePoint24_3(float64(nums[0])+float64(nums[2]), float64(nums[1]), float64(nums[3])) ||
11        judgePoint24_3(float64(nums[0])-float64(nums[2]), float64(nums[1]), float64(nums[3])) ||
12        judgePoint24_3(float64(nums[0])*float64(nums[2]), float64(nums[1]), float64(nums[3])) ||
13        judgePoint24_3(float64(nums[0])/float64(nums[2]), float64(nums[1]), float64(nums[3])) ||
14        judgePoint24_3(float64(nums[2])-float64(nums[0]), float64(nums[1]), float64(nums[3])) ||
15        judgePoint24_3(float64(nums[2])/float64(nums[0]), float64(nums[1]), float64(nums[3])) ||
16
17        judgePoint24_3(float64(nums[0])+float64(nums[3]), float64(nums[2]), float64(nums[1])) ||
18        judgePoint24_3(float64(nums[0])-float64(nums[3]), float64(nums[2]), float64(nums[1])) ||
19        judgePoint24_3(float64(nums[0])*float64(nums[3]), float64(nums[2]), float64(nums[1])) ||
20        judgePoint24_3(float64(nums[0])/float64(nums[3]), float64(nums[2]), float64(nums[1])) ||
21        judgePoint24_3(float64(nums[3])-float64(nums[0]), float64(nums[2]), float64(nums[1])) ||
22        judgePoint24_3(float64(nums[3])/float64(nums[0]), float64(nums[2]), float64(nums[1])) ||
23
24        judgePoint24_3(float64(nums[2])+float64(nums[3]), float64(nums[0]), float64(nums[1])) ||
25        judgePoint24_3(float64(nums[2])-float64(nums[3]), float64(nums[0]), float64(nums[1])) ||
26        judgePoint24_3(float64(nums[2])*float64(nums[3]), float64(nums[0]), float64(nums[1])) ||
27        judgePoint24_3(float64(nums[2])/float64(nums[3]), float64(nums[0]), float64(nums[1])) ||
28        judgePoint24_3(float64(nums[3])-float64(nums[2]), float64(nums[0]), float64(nums[1])) ||
29        judgePoint24_3(float64(nums[3])/float64(nums[2]), float64(nums[0]), float64(nums[1])) ||
30
31        judgePoint24_3(float64(nums[1])+float64(nums[2]), float64(nums[0]), float64(nums[3])) ||
32        judgePoint24_3(float64(nums[1])-float64(nums[2]), float64(nums[0]), float64(nums[3])) ||
33        judgePoint24_3(float64(nums[1])*float64(nums[2]), float64(nums[0]), float64(nums[3])) ||
34        judgePoint24_3(float64(nums[1])/float64(nums[2]), float64(nums[0]), float64(nums[3])) ||
35        judgePoint24_3(float64(nums[2])-float64(nums[1]), float64(nums[0]), float64(nums[3])) ||
36        judgePoint24_3(float64(nums[2])/float64(nums[1]), float64(nums[0]), float64(nums[3])) ||
37
38        judgePoint24_3(float64(nums[1])+float64(nums[3]), float64(nums[2]), float64(nums[0])) ||
39        judgePoint24_3(float64(nums[1])-float64(nums[3]), float64(nums[2]), float64(nums[0])) ||
40        judgePoint24_3(float64(nums[1])*float64(nums[3]), float64(nums[2]), float64(nums[0])) ||
41        judgePoint24_3(float64(nums[1])/float64(nums[3]), float64(nums[2]), float64(nums[0])) ||
42        judgePoint24_3(float64(nums[3])-float64(nums[1]), float64(nums[2]), float64(nums[0])) ||
43        judgePoint24_3(float64(nums[3])/float64(nums[1]), float64(nums[2]), float64(nums[0]))
44}/<code>


Go語言示例


搞定收工,我們整合全部代碼如下:

<code> 1//硬核編程...
2func judgePoint24(nums []int) bool {
3    return judgePoint24_3(float64(nums[0])+float64(nums[1]), float64(nums[2]), float64(nums[3])) ||
4        judgePoint24_3(float64(nums[0])-float64(nums[1]), float64(nums[2]), float64(nums[3])) ||
5        judgePoint24_3(float64(nums[0])*float64(nums[1]), float64(nums[2]), float64(nums[3])) ||
6        judgePoint24_3(float64(nums[0])/float64(nums[1]), float64(nums[2]), float64(nums[3])) ||
7        judgePoint24_3(float64(nums[1])-float64(nums[0]), float64(nums[2]), float64(nums[3])) ||
8        judgePoint24_3(float64(nums[1])/float64(nums[0]), float64(nums[2]), float64(nums[3])) ||
9
10        judgePoint24_3(float64(nums[0])+float64(nums[2]), float64(nums[1]), float64(nums[3])) ||
11        judgePoint24_3(float64(nums[0])-float64(nums[2]), float64(nums[1]), float64(nums[3])) ||
12        judgePoint24_3(float64(nums[0])*float64(nums[2]), float64(nums[1]), float64(nums[3])) ||
13        judgePoint24_3(float64(nums[0])/float64(nums[2]), float64(nums[1]), float64(nums[3])) ||
14        judgePoint24_3(float64(nums[2])-float64(nums[0]), float64(nums[1]), float64(nums[3])) ||
15        judgePoint24_3(float64(nums[2])/float64(nums[0]), float64(nums[1]), float64(nums[3])) ||
16
17        judgePoint24_3(float64(nums[0])+float64(nums[3]), float64(nums[2]), float64(nums[1])) ||
18        judgePoint24_3(float64(nums[0])-float64(nums[3]), float64(nums[2]), float64(nums[1])) ||
19        judgePoint24_3(float64(nums[0])*float64(nums[3]), float64(nums[2]), float64(nums[1])) ||
20        judgePoint24_3(float64(nums[0])/float64(nums[3]), float64(nums[2]), float64(nums[1])) ||
21        judgePoint24_3(float64(nums[3])-float64(nums[0]), float64(nums[2]), float64(nums[1])) ||
22        judgePoint24_3(float64(nums[3])/float64(nums[0]), float64(nums[2]), float64(nums[1])) ||
23
24        judgePoint24_3(float64(nums[2])+float64(nums[3]), float64(nums[0]), float64(nums[1])) ||
25        judgePoint24_3(float64(nums[2])-float64(nums[3]), float64(nums[0]), float64(nums[1])) ||
26        judgePoint24_3(float64(nums[2])*float64(nums[3]), float64(nums[0]), float64(nums[1])) ||
27        judgePoint24_3(float64(nums[2])/float64(nums[3]), float64(nums[0]), float64(nums[1])) ||
28        judgePoint24_3(float64(nums[3])-float64(nums[2]), float64(nums[0]), float64(nums[1])) ||
29        judgePoint24_3(float64(nums[3])/float64(nums[2]), float64(nums[0]), float64(nums[1])) ||
30
31        judgePoint24_3(float64(nums[1])+float64(nums[2]), float64(nums[0]), float64(nums[3])) ||
32        judgePoint24_3(float64(nums[1])-float64(nums[2]), float64(nums[0]), float64(nums[3])) ||
33        judgePoint24_3(float64(nums[1])*float64(nums[2]), float64(nums[0]), float64(nums[3])) ||
34        judgePoint24_3(float64(nums[1])/float64(nums[2]), float64(nums[0]), float64(nums[3])) ||
35        judgePoint24_3(float64(nums[2])-float64(nums[1]), float64(nums[0]), float64(nums[3])) ||
36        judgePoint24_3(float64(nums[2])/float64(nums[1]), float64(nums[0]), float64(nums[3])) ||
37
38        judgePoint24_3(float64(nums[1])+float64(nums[3]), float64(nums[2]), float64(nums[0])) ||
39        judgePoint24_3(float64(nums[1])-float64(nums[3]), float64(nums[2]), float64(nums[0])) ||
40        judgePoint24_3(float64(nums[1])*float64(nums[3]), float64(nums[2]), float64(nums[0])) ||

41        judgePoint24_3(float64(nums[1])/float64(nums[3]), float64(nums[2]), float64(nums[0])) ||
42        judgePoint24_3(float64(nums[3])-float64(nums[1]), float64(nums[2]), float64(nums[0])) ||
43        judgePoint24_3(float64(nums[3])/float64(nums[1]), float64(nums[2]), float64(nums[0]))
44}
45
46func judgePoint24_3(a, b, c float64) bool {
47    return judgePoint24_2(a+b, c) ||
48        judgePoint24_2(a-b, c) ||
49        judgePoint24_2(a*b, c) ||
50        judgePoint24_2(a/b, c) ||
51        judgePoint24_2(b-a, c) ||
52        judgePoint24_2(b/a, c) ||
53
54        judgePoint24_2(a+c, b) ||
55        judgePoint24_2(a-c, b) ||
56        judgePoint24_2(a*c, b) ||
57        judgePoint24_2(a/c, b) ||
58        judgePoint24_2(c-a, b) ||
59        judgePoint24_2(c/a, b) ||
60
61        judgePoint24_2(c+b, a) ||
62        judgePoint24_2(c-b, a) ||
63        judgePoint24_2(c*b, a) ||
64        judgePoint24_2(c/b, a) ||
65        judgePoint24_2(b-c, a) ||
66        judgePoint24_2(b/c, a)
67}
68
69func judgePoint24_2(a, b float64) bool {
70    return (a+b  24-1e-6) ||
71        (a*b  24-1e-6) ||
72        (a-b  24-1e-6) ||
73        (b-a  24-1e-6) ||
74        (a/b  24-1e-6) ||
75        (b/a  24-1e-6)
76}/<code>


由於代碼過於硬核

我們直接擊敗100%的對手:

(沒想到吧!代碼還可以這麼寫~)

小浩算法|一文讓你學會如何用代碼判斷

本期的題目應該都能看懂嗎?

大家還有其他的方法來得到答案嗎?

評論區留下你的想法吧!


原文首發:「小浩算法」


分享到:


相關文章: