美妙的约会

牛客网刷题地址

题目描述

  牛牛和妞妞在一天晚上决定一起去看一场情人节演唱会,可是由于这场演唱会实在太出名了,有很多情侣都来观看,牛牛和妞妞不小心被人流冲散了!
维持秩序的人决定,让大家排成一列,相邻两个进去的人(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位置上的编号,在后面的序列中去寻找相同的元素,找到后从该位置往前进行交换并记录次数。
美妙的约会_第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;
    }
}

你可能感兴趣的:(Java,刷题)