CF 144A.Arrival of the General(Java实现)

题目分析

        一个n个身高数据,问最高的到最前面,最矮的到最后面的最短交换次数

思路分析

        首先,如果数据有重复项,例如示例二中,最矮的数据就是最后一个出现的数据位置,最高的数据就是最先出现的数据位置;其次,最高和最矮的位置关系,如果最高的在左边,最矮的在右边,例如示例一,就互不干扰,直接计算距离。如果二者交换,那么当某一方先往另一方移动时,就会产生一次交换,帮助另一方移动一次

代码


import java.util.*;

public class Main {

	public static void main(String[] args)  {
		Scanner sc = new Scanner(System.in);
		int n= sc.nextInt();//数据样本
		sc.nextLine();
		int min=100;//设计一个最小值再初始化一个比较大的值,此处设置不严谨但是刚好够用
		int max=-1;//设计一个最大值在初始化一个比较小的值,由于此处都是正数所以可以初始化负数
		int[] brr=new int[2];//作为存储最大值和最小值位置的数组,也可以直接用两个单独的int变量
		for (int i = 0; i < n; i++) {//遍历存值
			int temp=sc.nextInt();//存值
			if (temp<=min){//如果更小,有可能有其他同样最小值所以这里用=,同步更新位置信息
				min=temp;//更新最小值
				brr[0]=i;//存入最小位置信息
			}
			if (temp>max){//如果更大,由于这里只找最先出现的最大值,所以不用=
				max=temp;//更新最大值
				brr[1]=i;//存入最大位置信息
			}
		}
		int re=0;//初始化答案
		if (brr[0]>brr[1]){//如果最小值在最大值右边,即互不干扰
			re=brr[1]+n-(brr[0]+1);//直接赋值左右两边的临界距离
		} else if (brr[0]<brr[1]) {//如果交叉干扰
			re=n-1-brr[0]+brr[1]-1;//两个值临界距离-1
		}
		System.out.println(re);
	}
}

        感谢您能够看到这里,一起见证小何同学的算法学习,如果您有不同的见解,希望能得到您的指点和点悟;如果您是和我一样的同学,也希望这篇文章能对您有所帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值