题目描述
牛牛和妞妞在一天晚上决定一起去看一场情人节演唱会,可是由于这场演唱会实在太出名了,有很多情侣都来观看,牛牛和妞妞不小心被人流冲散了!
维持秩序的人决定,让大家排成一列,相邻两个进去的人(2k-1和2k,k为正整数)坐在相邻座位。但是现在的队伍乱糟糟的,有很多情侣都不在相邻位置。维持秩序的人同意让情侣们跟相邻的人交换位置,直到所有情侣都在2k-1和2k位置上为止。
但是维持秩序的人很没有耐心,所以需要最少的交换次数,你能帮情侣们算出这个次数吗?
输入输出描述
输入描述: 第一行一个整数n,表示一共有n对情侣,编号从1到n。同一对情侣编号相同。1<=n<=100
第二行2n个整数ai,表示编号为ai的情侣在第i个位置。1<=ai<=n
输出描述: 一个整数,代表最少交换次数。
示例
示例1:
输入:
3
3 3 2 2 1 1
输出:
0示例2:
输入:
4
1 2 3 4 1 2 3 4
6
解题思路
求解交换的次数,且必须将2k-1、2k的元素相同(1<=k<=n),由于没有对编号的顺序进行固定,那么我们就可以采用固定2k-1位置上的编号,在后面的序列中去寻找相同的元素,找到后从该位置往前进行交换并记录次数。

代码
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 总人数 = 情侣的对数 * 2
int n = sc.nextInt() * 2;
// 开辟数组,保留情侣的编号
int[] arr = new int[n];
for(int i = 0; i < arr.length; i++){
arr[i] = sc.nextInt();
}
//------------------核心处理----------------------
// 默认2k-1和2k为相邻座位,由于数组是从0开始的,所以就默认2k和2k+1为相邻座位
// 每次确定2k处的编号,从剩余的座位中寻找相同的编号交换
int count = 0;
for(int i = 0; i < arr.length; i+=2){
// 如果下一个座位和当前座位的编号相同,直接跳出本次循环
if(arr[i+1] == arr[i]){
// 只是跳出本次循环,还需要判断后序的位置
continue;
}
// 不相同,需要寻找相同的元素
int index = findO(arr, i+1, arr[i]);
// 从当前位置往前交换,直至将arr[index]上的元素交换至i+1位置上
for(int j = index; j > i+1; j--){
int tmp = arr[j];
arr[j] = arr[j-1];
arr[j-1] = tmp;
++count;
}
}
System.out.println(count);
}
private static int findO(int[] arr, int start, int key){
for(int i = start; i < arr.length; i++){
if(arr[i] == key){
return i;
}
}
return -1;
}
}

479

被折叠的 条评论
为什么被折叠?



