Hackerrank Minimum swaps 2 – loop goes to infinity from a small change in code
Question:
This challenge asks that you find the minimum number of swaps to sort an array of jumbled consecutive digits to ascending order. This is the correct function for the question:
def minimumSwaps(arr):
n = 0
i =0
while i < len(arr):
index = arr[i]-1
if arr[i] != arr[index]:
arr[i], arr[index] = arr[index], arr[i]
n+=1
print(arr)
else:
i+=1
return n
However if I get rid of the index = arr[i]-1 and replace index with arr[i]-1 everywhere like this:
def minimumSwaps(arr):
n = 0
i =0
while i < len(arr):
if arr[i] != arr[arr[i]-1]:
arr[i], arr[arr[i]-1] = arr[arr[i]-1], arr[i]
n+=1
print(arr)
else:
i+=1
return n
The loop goes to infinity and I cant figure out why this is the case.
Any help will be appreciated.
Answers:
arr[i], arr[arr[i]-1] = arr[arr[i]-1], arr[i]
first evaluates the rhs terms arr[arr[i]-1], arr[i]
this is unchanged compared to using index
, now think of them being stored in temporary variables a
and b
. Then it assigns to the lhs terms one by one. First a
to arr[i]
and only after assigns b
to arr[arr[i]-1]
, at this stage arr[i]
has alreday changed so this is no longer equivalent to using index
.
This challenge asks that you find the minimum number of swaps to sort an array of jumbled consecutive digits to ascending order. This is the correct function for the question:
def minimumSwaps(arr):
n = 0
i =0
while i < len(arr):
index = arr[i]-1
if arr[i] != arr[index]:
arr[i], arr[index] = arr[index], arr[i]
n+=1
print(arr)
else:
i+=1
return n
However if I get rid of the index = arr[i]-1 and replace index with arr[i]-1 everywhere like this:
def minimumSwaps(arr):
n = 0
i =0
while i < len(arr):
if arr[i] != arr[arr[i]-1]:
arr[i], arr[arr[i]-1] = arr[arr[i]-1], arr[i]
n+=1
print(arr)
else:
i+=1
return n
The loop goes to infinity and I cant figure out why this is the case.
Any help will be appreciated.
arr[i], arr[arr[i]-1] = arr[arr[i]-1], arr[i]
first evaluates the rhs terms arr[arr[i]-1], arr[i]
this is unchanged compared to using index
, now think of them being stored in temporary variables a
and b
. Then it assigns to the lhs terms one by one. First a
to arr[i]
and only after assigns b
to arr[arr[i]-1]
, at this stage arr[i]
has alreday changed so this is no longer equivalent to using index
.