2013-11-22 35 views
3

算法問題中:算法來確定一個值是否在範圍內的多個

比方說,我想確定一個值是否在範圍內(例如2)幾十多 - 所以,8- 12,18-22,28-32等

我目前的解決方案是將範圍添加到值,mod 10,然後重新減去範圍 - 從而留給我一些從-2到8的東西 - 然後檢查絕對值是否小於所需的範圍。

value = 38 
range = 2 
cycle = 10 

tweaked_mod = ((value + range) % cycle) - range 
# tweaked_mod = -2 
within_range = (abs(tweaked_mod) <= range) 
# within_range = True 

與:

value = 37 
range = 2 
cycle = 10 

tweaked_mod = ((value + range) % cycle) - range 
# tweaked_mod = 7 
within_range = (abs(tweaked_mod) <= range) 
# within_range = False 

它的工作原理,但它的尷尬。

我錯過了一個更直觀/簡潔的算法嗎?

+1

爲什麼你不能只取值10,然後檢查答案是否是<範圍,如果< 5 and > 10範圍,如果> 5 –

+0

@Ahhishek - 我暫時(本地)工作的算法本質上是做並且同意,最終解釋/評論更清楚。儘管如此,我仍然在發表這個主題的理由是,以防萬一我錯過了一些更深入/更強大的概念來完成同樣的事情,無論是一般的還是專門用Python。 – DreadPirateShawn

+0

另外,隨時發佈您的建議作爲答案 - 如果這仍然是最明確的方法,那麼我想將其標記爲選定的答案。 – DreadPirateShawn

回答

7

我覺得這個解決方案更易於理解:

remainder = (value % cycle) 
(remainder <= range) || (cycle - remainder) <= range 

基本上我找到了我value關於模(cycle)的搜索,然後檢查它是否在預期範圍內的剩餘部分。

備選:

另一種解決方案(這樣做基本上是相同的)將是:

remainder = (value % cycle) 
min(remainder, cycle - remainder) <= range 

您可以自由選擇兩種解決方案無論你更喜歡。

備註該算法按逐字法運行,如果range < cycle。在其他情況下,答案總是如此。

+0

我想出的是(餘數<=範圍)|| (餘數> =(週期範圍))。對於循環10和範圍2,它將創建條件餘數<= 2 ||餘數> = 8 &&餘數<10。餘數<10表示通過模數運算。 – JustinDanielson

+0

非常感謝。我很喜歡這個方法。較少的計算,因此較少評論/維護。 – DreadPirateShawn

+0

此外 - 問題(因此回答)已在我的代碼中進行了評論以供參考,因此未來可能會有更多點擊/投票。 – DreadPirateShawn

相關問題