时间限制: 1Sec 内存限制: 32MB
题目描述:(原题链接)
有两个链表a和b,设节点中包含学号、成绩。从a链表中删去b链表中有相同学号的那些节点。
输入:
第一行有两个用空格隔开的整数n和m,分别表示a和b两个链表中的节点个数。保证n和m均不超过100。之后的n行每行有两个用空格隔开的整数,分别表示一个学生的学号和成绩。
最后的m行每行有两个用空格隔开的整数,分别表示一个学生的学号和成绩。
a和b两个链表中的节点并不一定按照学号顺序排列。保证a链表中学号各不相同,b链表中学号各不相同。
样例输入:
3 3
106 90
104 80
101 85
104 95
106 88
105 87
输出:
首先输出a链表最终剩下的节点个数k。
在接下来的k行,每行输出两个用空格隔开的整数,分别表示一个学生的学号和成绩。
请注意行尾输出换行。
样例输出 :
1
101 85
解题思路:
建立两个对象数组,查找arr1中是否含arr2中的id,若有则删除。
注意事项:
判断循环位置时,需要注意删除元素后,arr1的结构发生变化,需要从下标0重新开始查找
参考代码:
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
int id ,score;
Main(int id,int score) {
this.id=id;this.score=score;
}
public String toString() {
return ""+id+" "+score;
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n=in.nextInt(),m=in.nextInt();
ArrayList<Main> arr1= new ArrayList<Main>();
ArrayList<Main> arr2= new ArrayList<Main>();
for(int i=0;i<n;i++) {
arr1.add(new Main(in.nextInt(), in.nextInt()));
}
for(int i=0;i<m;i++) {
arr2.add(new Main(in.nextInt(), in.nextInt()));
}
int k=0; //用来记录删除节点后的循环起点
while(k<arr1.size()) {
int i=k,flag=0; //flag用来标记当前循环是否删除了符合条件的节点
for(int j=0;j<arr2.size();j++) {
if(arr1.get(i).id==arr2.get(j).id)
{
arr1.remove(i); //删除节点
flag=0; //置为0表示arr1数组结构已经改变,需要移动起点k
break;
}else {
flag++;
}
}
if(flag!=0) //如果没删除节点,则起点为k的下一位置k+1
k++;
else
k=0; //如果删除过节点,则起点重新为0,即从arr1[0]开始查找
}
System.out.println(arr1.size());
for(Main o:arr1)
System.out.println(o);
in.close();
}
}