আমাদের একটি অ্যারে আছে nums এবং আমাদের সোয়াপের সংখ্যা বের করতে হবে যাতে nums যেকোনো ক্রমে (আরোহী বা অবরোহী) সর্টেড হয়।
উদাহরণস্বরূপ, ইনপুট nums = [2, 5, 6, 3, 4] হলে আউটপুট হবে 2 কারণ প্রাথমিক nums = [2, 5, 6, 3, 4]। যদি 6 এবং 4 সোয়াপ করি, অ্যারে হবে [2,5,4,3,6]। তারপর 5 এবং 3 সোয়াপ করলে অ্যারে হবে [2,3,4,5,6]। তাই আরোহী ক্রমে সর্ট করার জন্য ২টি সোয়াপ লাগে।
সমাধানের ধাপসমূহ
swap_count()ফাংশন ডিফাইন করুন। এটিinput_arrইনপুট নেবে:pos := input_arr-এর প্রতিটি আইটেমের জন্য(item_position, item)টাপল ধারণকারী একটি নতুন লিস্টpos-কেinput_arr-এর আইটেম অনুযায়ী সর্ট করুনcnt := 0index= 0 থেকেinput_arr-এর আকার পর্যন্ত লুপ চালান:যখন
Trueথাকাকালীন লুপ চালান:যদি
pos[index][0] == indexহয়, তবে:লুপ থেকে বেরিয়ে আসুন
অন্যথায়:
cnt := cnt + 1swap_index := pos[index][0]pos[index]এবংpos[swap_index]-এর মান সোয়াপ করুন
cntরিটার্ন করুন
মূল ফাংশন থেকে নিচের কাজ করুন:
min(swap_count(input_arr), swap_count(input_arr[::-1]))রিটার্ন করুন
উদাহরণ
নিচের ইমপ্লিমেন্টেশনটি দেখুন ভালোভাবে বুঝার জন্য:
def swap_count(input_arr):
pos = sorted(list(enumerate(input_arr)), key=lambda x: x[1])
cnt = 0
for index in range(len(input_arr)):
while True:
if pos[index][0] == index:
break
else:
cnt += 1
swap_index = pos[index][0]
pos[index], pos[swap_index] = pos[swap_index], pos[index]
return cnt
def solve(input_arr):
return min(swap_count(input_arr), swap_count(input_arr[::-1]))
nums = [2, 5, 6, 3, 4]
print(solve(nums)) ইনপুট
[2, 5, 6, 3, 4]
আউটপুট
2