其實方法solution
應稍微更改爲:
def solution(X,A):
checker = 0
final_val = pow(2,X) - 1
for x in range(len(A)):
checker = checker | 1 << (A[x] - 1)
if(checker == final_val):
return x
return -1
A = [1,3,1,4,2,3,5,4]
print(solution(5,A))
這個算法背後的基本思想是確保所有的葉子落在河邊,包括posi通過使用葉子位置的按位運算和二進制表示來生成X
。
爲了使這項工作,你定義final_val
這等於2^X -1
。在X
是5
,final_val
是2^5 - 1 = 31
的情況下。然後你遍歷列表A
。
這是最有趣的部分。
checker = checker | 1 << (A[x] - 1)
您初始化checker
爲等於0
。
然後讓我們分解上面的表達式:
1 << (A[x] - 1)
相同2 ^(A [X] - 1)。該操作將二進制1向左移位01A [x]`。
然後去|
運營商(OR
)。在這種情況下,這是某種plus
運算符,但它不會添加重複的術語。
讓我們通過給出的例子來說明它是如何工作的。
x = 0:
1 << A[0] - 1 which is 1 << 1 - 1
1 << 0
無變化。 1保持1.
checker = 0 | 1
按位|
給出1.
所以checker
現在1。這意味着有在1
位置的葉。
x = 1:
1 << A[1] - 1 which is 1 << 3 - 1
1 << 2
所以現在1變爲二進制100。這意味着在位置3
處有一片葉子。
然後:
checker = 1 | 100
其實這是001 | 100
這給101
。
x = 2:
checker = 101 | 1 << 0
= 101
注意,這裏位置1
已經出現,所以它不會改變checker
變量。
x = 3:
checker = 101 | 1 << 3
= 101 | 1000
= 0101 | 1000
= 1101
現在checker
是1101
。這意味着在位置4
有一片葉子。
x = 4:
checker = 1101 | 1 << 1
= 1101 | 10
= 1101 | 0010
= 1111
這意味着在位置2
有一片葉子。
x = 5:
checker = 1111 | 1 << 4
= 1111 | 10000
= 01111 | 10000
= 11111
這意味着在位置5
有一片葉子。
但這是青蛙需要得到的位置。
這就是爲什麼有一個檢查條件,比較checker
和final_val
每次迭代。
所以我們看到等於final_val
(31是11111的二進制),算法返回5
的位置,其中6
。
請注意,如果某些位置沒有出現在5之前,例如而不是2
有1
,那麼算法將返回-1,因爲青蛙無法到達位置5
。
你的問題變得更有趣)))。 – Nurjan