题目分析
一个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);}
}
感谢您能够看到这里,一起见证小何同学的算法学习,如果您有不同的见解,希望能得到您的指点和点悟;如果您是和我一样的同学,也希望这篇文章能对您有所帮助。