我在一次在線評估中被問到這個問題(我是一名正在尋找 SDE 實習的學生)并且無法及時解決它(我只給了 5 分鐘......)。順便說一句,你們認為這個問題 5 分鐘就足夠了嗎?我只是有點好奇其他人有多好。
不管怎樣,問題來了:
給定兩個整數元組
(A, B)和(C, D)。
您可以執行兩種操作:
(A B, B)
(A, A B)
撰寫一個回傳Trueif的函式,(A, B)可以(C, D)使用這兩個操作將其轉換為False否則。
例子:
Input: A = 2, B = 3, C = 8, D = 11
Output: True
我會把我在評估期間寫的“想法”放在這里(我只有 70% 的把握)。它似乎作業正常,我不確定為什么它不能通過測驗。如果你們知道問題是什么,或者正確的解決方案,請告訴我!
def func(A, B, C, D):
if A == C and B == D:
return True
if A > C or B > D:
return False
return func(A B , B, C, D) or func(A, A B, C, D)
uj5u.com熱心網友回復:
這是一個完整的解決方案,適用于正整數和負整數的混合。
我不希望未來的實習生能在 5 分鐘內解決這個問題。事實上,他們希望你我會打電話給紅旗。
def op_test(a, b, c, d):
if a == c and b == d:
return True
if max(a, b) < 0 and min(a, b) < min(c, d):
# No way to increase min(a, b)
return False
elif 0 < min(a, b) and max(c, d) < max(a, b):
# No way to decrease max(a, b)
return False
# The 0 checks are to avoid endless recursion.
if 0 != a and op_test(a, a b, c, d):
return True
if 0 != b and op_test(a b, b, c, d):
return True
return False
uj5u.com熱心網友回復:
你必須小心,如果 A==0 或 B==0 你可能會得到無限遞回并破壞你的堆疊。您需要檢測該條件并回傳 False。
return (B != 0 and func(A B , B, C, D)) or (A != 0 and func(A, A B, C, D))
uj5u.com熱心網友回復:
從目標向下有一條獨特的路徑(假設為正整數),因此朝該方向前進以避免出現較大的搜索空間。
即總是將較大的坐標減少較小的,或較小的任何整數倍,不會超過您的目標。
例如 8,11 -> 8,3 -> 2,3 是從目標向下的唯一路徑,通過將較大的坐標減少不會過沖的較小的最大乘數來實作。
我們可以在開始和結束坐標在同一象限中的任何時候使用類似的邏輯。
如果起點在 I 或 III 象限,而終點在 II 或 IV 象限,則沒有解決方案。對于相反的情況,我認為(但尚未證明)有一個解決方案 iff gcd(A,B) = gcd(C,D)。孩子們上床睡覺后,我會回到這個問題并編輯我的答案。
uj5u.com熱心網友回復:
我希望它有幫助
def recursively(A,B,C,D):
if A < C :
A = A B
return recursively(A,B,C,D)
if B < D:
B = A B
return recursively(A,B,C,D)
if A == C and B == D:
return True
if A > C and B > D:
return False
return False
print(recursively(2,3,8,11))
uj5u.com熱心網友回復:
您可以嘗試使用 BFS 或 DFS 方法。我會選擇 BFS,因為它會以最快的速度讓您到達(解決方案狀態)。另外,請確保您有一個閾值來在沒有解決方案的情況下停止回圈(無法達到 C、D)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/398746.html
上一篇:遞回洗掉重復字符C
下一篇:從圓串列中回傳最小的圓
