48 lines
947 B
Python
48 lines
947 B
Python
import unittest
|
|
|
|
def magic_index(s):
|
|
if not s:
|
|
return -1
|
|
if s[0] == 0:
|
|
return 0
|
|
idx1 = 0
|
|
idx2 = 0
|
|
nonvisited = [i for i in range(len(s))]
|
|
while len(nonvisited) > 1:
|
|
if s[idx1] == idx1:
|
|
return idx1
|
|
|
|
idx2 = s.index(idx2)
|
|
s[idx2] = 0
|
|
nonvisited.remove(idx2)
|
|
|
|
if idx1 == idx2:
|
|
return nonvisited[0]
|
|
|
|
val = s[idx1]
|
|
s[idx1] = 0
|
|
nonvisited.remove(idx1)
|
|
idx1 = val
|
|
|
|
if idx1 == idx2:
|
|
return nonvisited[0]
|
|
|
|
return -1
|
|
|
|
class Test(unittest.TestCase):
|
|
|
|
data = [([], -1),
|
|
([2,1,0], 1),
|
|
([1,2,0], -1),
|
|
([1,2,3,4,0,5], 5),
|
|
([7,4,5,3,2,0,6,1], 3),]
|
|
|
|
def test_unique(self):
|
|
for test in self.data:
|
|
res = magic_index(test[0])
|
|
self.assertEqual(res, test[1])
|
|
return
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|