描述
N对夫妇坐在2N个排成一排的座位上. 现求最小的交换数量,使每对夫妇并坐一起,他们可以手牵着手。
一次交换可选择任何两个人交换座位。
人和座位由从0到2N-1的整数表示,夫妻按顺序编号,第一对是(0,1),第二对是(2,3),以此类推,最后一对是(2N-2,2N-1)。
初始座位由row [i]给出,表示坐在第i座位的人的编号。
1.len(row) 是偶数且范围为 [4, 60].
2.row 一定是[0, 1…len(row)-1]的一个排列.
您在真实的面试中是否遇到过这个题?
样例
样例 1:
输入: row = [0, 2, 1, 3]
输出: 1
解释: 只需交换row[1]的人和row[2]的人即可.
样例 2:
输入: row = [3, 2, 0, 1]
输出: 0
解释: 每一对夫妇已经并坐一起.
思路:
如给出一个正确输入:row=[0,1,2,3]。 row = [3, 2, 0, 1]
步骤1:从左到右遍历奇数位置的人,设定当前遍历的数为row[i]
步骤2::如果row[i]为偶数,则row[i]的伴侣应该为row[i]+1,如row=[0,1,2,3]中0的伴侣是1;如果row[i]为奇数,则row[i]的伴侣为row[i]-1。如row=[0,1,2,3]中3的伴侣为2。
步骤3:返回row[i]伴侣的索引位置。list.index(a)会返回list中值为a的索引位置
步骤4:将找到的row[i]伴侣 和row[i+1] 交换下位置
步骤5:次数+1
代码1
class Solution:
def minSwapsCouples(self,row):
# row :list[int]
res=0 #记录次数
for i in range(0,len(row),2):#从左到右遍历奇数位置的人
tag=row[i]+1 if row[i]%2==0 else row[i]-1 #找到当前row[i]的伴侣 。找到伴侣值
if row[i+1]!=tag:#如果row[i]的伴侣不是后一位,则寻找它的伴侣和row[i+1] 交换位置
tagindex=row.index(tag)#row[i]的伴侣的位置索引
row[i+1],row[tagindex]=row[tagindex],row[i+1]
res+=1
return res
c=Solution()
d=c.minSwapsCouples([0,2,1,3])
print(d)
结果:1
代码2:
class Solution:
def minSwapsCouples(self, row: List[int]) -> int:
res = 0
for i in range(0,len(row),2):#从左到右遍历奇数位置的人
x = row[i]^1 #找人到row[i]的伴侣值
if x == row[i+1]:#如果row[i]后一个为伴侣,不计数,退出本次循环
continue
res += 1#如果row[i]后一个不为伴侣,计数+1,并for 循环找到row[i]伴侣,和row[i+1]交换位置
for j in range(i+1,len(row)):
if row[j] == x:
row[i+1],row[j] = row[j],row[i+1]
break
return res
说明:row[i]^1 异或1
row[i]为偶数时 row[i]^1 =row[i]+1
row[i]为奇数时 row[i]^1 =row[i]-1
记忆:偶数 为0 ,或为0,异或为1 (等于偶数(0)+1)
奇数 为1 ,或为1,异或为0 (等于奇数(1)-1)
print("19^1的结果是",19^1)
print("18^1的结果是",18^1)
在这里插入图片描述