题目描述
在一场集体婚礼上,有n对新人需要坐在连续排列的 2n个座位上合影,同一对新人彼此挨着。由于进场时各对新人并未按序入座,请计算最少交换座位的次数,以便使每对新人均可并肩坐在一起。一次交换可选择任意两人,让他们互换座位。
全部新人的序号可用 0 到 2n-1 的整数表示,第一对是 (0, 1),第二对是 (2, 3),以此类推,最后一对是 (2n-2, 2n-1)。
row[i]指最初坐在第 i 个座位上的新人编号,i是从0到(2n-1)的一个升序全排列,row不存在重复值。
输入描述
输入共有2行,第一行为n,即共有多少对新人(2≤n≤100000 ),第二行为row,即2n个座位上的初始新人编号。
输出描述:
输出最少交换座位的次数。
示例1
输入
2
0 2 1 3
输出
1
思路
//1从左到右判断一个数的奇偶,用i记录位置
//2如果为偶数r,则判断下一个是否为r+1;
//3如果为偶数r,则判断下一个是否为r-1;
//4如果是则继续向后判断,返回1
//5如果不是则向后寻找r+1或r-1,记录其位置j,找到后交换i+1和j的位置,count+1
//6当i等于2n-1时,结束
import java.util.Scanner;
public class Add {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int m =0;
while(m<10){
String nstr = in.nextLine();
int n = Integer.parseInt(nstr);
int[] nums = new int[2*n];
String haoStr = in.nextLine();
String[] haoStrArr = haoStr.split(" ");
for(int i =0;i<nums.length;i++){
nums[i] = Integer.parseInt(haoStrArr[i]);
}
System.out.println(change(nums));
m++;
}
}
public static int change(int[] nums){
int count =0;
for(int i=0;i<nums.length-1;i=i+2){
if(nums[i]%2==0){
if(nums[i+1]!=nums[i]+1){
for(int j =i+2;j<nums.length;j++){
if(nums[j]==nums[i]+1){
int m = nums[j];
nums[j]=nums[i+1];
nums[i+1]=nums[i]+1;
count++;
}
}
}
}
if(nums[i]%2==1){
if(nums[i+1]!=nums[i]-1){
for(int j =i+2;j<nums.length;j++){
if(nums[j]==nums[i]-1){
int m = nums[j];
nums[j]=nums[i+1];
nums[i+1]=nums[i]-1;
count++;
}
}
}
}
}
return count;
}}
问题
在自己电脑上运行正常,但系统一直显示运行超时,求大神优化代码



京公网安备 11010502036488号