问题描述
有N个瓶子,编号 1 ~ N,放在架子上。比如有5个编号瓶子:2 1 3 5 4。要求每次拿起2个瓶子,交换它们的位置。经过若干次后,使得瓶子的序号为:1 2 3 4 5。对于这么简单的情况,显然,至少需要交换2次就可以复位。如果瓶子更多呢?
【输入】 输入格式为两行:第一行: 一个正整数N(N<10000), 表示瓶子的数目。第二行:N个正整数,用空格分开,表示瓶子目前的排列情况。
【输出】输出数据为一行一个正整数,表示至少交换多少次,才能完成排序。
解题思路
遍历数组,如果当前位置的瓶子编号不对,就找到那个正确编号的瓶子交换过来,累加得到交换的次数
核心代码
/*遍历数组,如果当前位置的瓶子编号不对,将正确编号的瓶子交换*/
for(int i=1;i<=num;i++)
if(i!=a[i])//若当前位置的瓶子编号不对
for(int j=1;j<=num;j++)
if(i!=j)
if(a[i]==j)//找到瓶子的正确编号
{
swap(i,j);//调用swap方法交换瓶子编号
count++;
}
完整代码
package test;
import java.util.Scanner;
public class test {
static int[] a;
/*定义交换编号的方法*/
public static void swap(int i,int j)
{
int temp=a[i];
a[i]=a[j];
a[j]=temp;
}
public static void main(String[] args) {
int num,count=0;
Scanner input=new Scanner(System.in);
num=input.nextInt();
a=new int[num+1];
for(int i=1;i<=num;i++)
a[i]=input.nextInt();
/*遍历数组,如果当前位置的瓶子编号不对,将正确编号的瓶子交换*/
for(int i=1;i<=num;i++)
if(i!=a[i])//若当前位置的瓶子编号不对
for(int j=1;j<=num;j++)
if(i!=j)
if(a[i]==j)//找到瓶子的正确编号
{
swap(i,j);//调用swap方法交换瓶子编号
count++;
}
System.out.println(count);
}