题目要求
题目分析
题目要求排名最靠前的和排名最靠后的异性同学在一个分组,所以一定是上半部分从上往下遍历,下半部分从下往上遍历,如果性别相同,继续寻找,如果性别不同,完成分组。
完成分组之后,需要有一种标记表示该同学已经分组,防止在后来的遍历中重复分组。可以设置一个新的标记位,但是由于题目中一旦完成分组,性别将没有其他意义,所以可以对性别进行修改,设置一个第三标识。
示例代码
import java.util.Scanner;
public class L1_030 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
//输入的班级学生总数
int countStudent = input.nextInt();
input.nextLine();
String str = null;
String[] arr = new String[2];
//保存学生性别的数组
int[] arr_sex = new int[countStudent];
//保存学生姓名的数组
String[] names = new String[countStudent];
//将输入的学生信息做拆分并保存到相应的数组当中
for(int i = 0; i < countStudent; i++) {
str = input.nextLine();
arr = str.split(" ");
arr_sex[i] = Integer.parseInt(arr[0]);
names[i] = arr[1];
}
input.close();
//将班级学生一分为二
int center = countStudent / 2;
//外层循环,用来读取排名靠前的学生
for(int i = 0; i < center; i++) {
//获取性别
int sex = arr_sex[i];
//内层循环,从后往前获取排名靠后的学生的信息
for(int j = countStudent - 1; j >= center; j--) {
//当性别不一样 并且后面的学生还没有分组的时候,进行匹配
if(sex != arr_sex[j] && arr_sex[j] != 2) {
//根据性别的下标,打印姓名
System.out.println(names[i] + " " + names[j]);
//修改已经完成分组的学生的信息,防止重复分组
arr_sex[j] = 2;
//一但完成分组,立即开始下一次循环
break;
}
}
}
}
}