题目
交替放置的玻璃环有2n个玻璃杯挨个排成一行,前n个装满苏打水,其余n个杯子为空。交换杯子的位置,使之按照满一空一满一空的模式排列,而且杯子动的次数要最少。
一、思路
二、代码
代码如下:
public class text6 {
public static int [] initArr(int n){
/*初始化数组,装满水为1,空为0*/
int arr[]=new int[2*n];
for(int i=0,j=n;i<n&&j<2*n;i++,j++){
arr[i]=1;
arr[j]=0;
}
return arr;
}
public static void main(String [] args){
int n=new Scanner(System.in).nextInt();
int arr[]=initArr(n);
for (int i :
arr) {
System.out.print(i+" ");
}
System.out.println();
System.out.println("交换了"+arrChange1(arr,n)+"次");
//System.out.println("交换了"+arrChange2(arr,n)+"次");
for (int i=0;i<2*n;i++){
System.out.print(arr[i]+" ");
}
}
public static int arrChange1(int arr[],int n){
/*从左到右遍历*/
int count=0;
int q=n%2;
for(int i=1,j=n+q;i<n&&j<2*n;i+=2,j+=2){
int item=arr[i];
arr[i]=arr[j];
arr[j]=item;
count++;
}
return count;
}
public static int arrChange2(int arr[],int n){
/*从两边到中间*/
int item=2,count=0;
while(item<2*n-item){
int temp=arr[item-1];
arr[item-1]=arr[2*n-item];
arr[2*n-item]=temp;
count++;
item+=2;
}
return count;
}
}
测试数据
4
1 1 1 1 0 0 0 0
交换了2次
1 0 1 0 1 0 1 0
6
1 1 1 1 1 1 0 0 0 0 0 0
交换了3次
1 0 1 0 1 0 1 0 1 0 1 0
交换次数都是n/2