题目描述:
给你一个下标从 0 开始、长度为 n 的整数排列 nums 。
如果排列的第一个数字等于 1 且最后一个数字等于 n ,则称其为 半有序排列 。你可以执行多次下述操作,直到将 nums 变成一个 半有序排列 :
- 选择 
nums中相邻的两个元素,然后交换它们。 
返回使 nums 变成 半有序排列 所需的最小操作次数。
排列 是一个长度为 n 的整数序列,其中包含从 1 到 n 的每个数字恰好一次。
代码思路:
- 获取列表长度: 
- 首先,通过 
n = len(nums)获取列表nums的长度。 
 - 首先,通过 
 - 计算数字 
n(最大值)的位置:- 使用 
nums.index(n)找到数字n(即列表中的最大值)的索引。 - 计算 
count1 = n - 1 - nums.index(n),这个值表示数字n需要向右移动多少个位置才能到达列表的末尾(因为所有较大的数都应该位于末尾)。这里减1是因为索引是从0开始的,而我们要计算的是位置差。 
 - 使用 
 - 移除数字 
n:- 使用 
nums.remove(n)从列表中移除数字n,因为我们接下来要计算数字1的位置,而n已经不在考虑范围内了。 
 - 使用 
 - 计算数字 
1的位置:- 使用 
nums.index(1)找到数字1的索引(在移除n之后)。 - 这个索引值直接作为 
count2,表示数字1需要向左移动多少个位置才能到达列表的开头(因为所有较小的数都应该位于开头)。 
 - 使用 
 - 返回结果: 
- 返回 
count1 + count2,即数字n移动到末尾和数字1移动到开头所需的最小交换次数之和。 
 - 返回 
 
注意事项
- 这个方法假设输入列表 
nums包含了从1到n的所有整数,且每个整数只出现一次。 - 方法通过直接计算数字 
n和1需要移动的位置来确定最小交换次数,而不是通过实际的交换操作来模拟。 - 移除数字 
n是为了简化计算数字1位置的过程,因为一旦n到达了正确的位置(即列表末尾),它就不会再影响数字1的位置计算。 
代码实现:
class Solution:def semiOrderedPermutation(self, nums) :n = len(nums)count1 = n - 1 -(nums.index(n))nums.remove(n)count2 = nums.index(1)return count1 + count2 
